日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

write/read/send/receive函数比较

發布時間:2025/4/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 write/read/send/receive函数比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

建立好TCP連接后,就可以把得到的套接字當做文件描述符來使用,由此,聯系到網絡程序里的基本讀寫函數,write、read;

l write函數:

Ssize_t write(int fd,const void *buf,size_t nbytes);

Write函數將buf中的nbytes字節內容寫入到文件描述符中,成功返回寫的字節數,失敗返回-1.并設置errno變量。在網絡程序中,當我們向套接字文件描述寫數據時有兩種可能:

1. write的返回值大于0,表示寫了部分數據或者是全部的數據,這樣用一個while循環不斷的寫入數據,但是循環過程中的buf參數和nbytes參數是我們自己來更新的,也就是說,網絡編程中寫函數是不負責將全部數據寫完之后再返回的,說不定中途就返回了!

2. 返回值小于0,此時出錯了,需要根據錯誤類型進行相應的處理。

如果錯誤是EINTR表示在寫的時候出現了中斷錯誤,如果是EPIPE表示網絡連接出現了問題。

l read函數:

Ssize_t read(int fd,void *buf,size_t nbyte);

Read函數是負責從fd中讀取內容,當讀取成功時,read返回實際讀取到的字節數,如果返回值是0,表示已經讀取到文件的結束了,小于0表示是讀取錯誤。

如果錯誤是EINTR表示在寫的時候出現了中斷錯誤,如果是EPIPE表示網絡連接出現了問題。

有了上面的兩個函數,我們就可以向客戶端或者是服務器端進行數據傳輸了!比如我要傳送一個結構體,可以使用下面的方法:

客戶端向服務器:

Struct student stu;

Write(sock,(void *)&stu,sizeof(struct student));

服務器讀:

Char buffer[sizeof(struct student)];

Struct *my_student;

Read(sock,(void *)buffer,sizeof(struct student));

My_student=(struct student)buffer;

在網絡上傳遞數據時,我們一般把數據轉換為char類型,接收的時候也是一樣的的。沒必要在網絡上傳遞指針。

l Recv函數和send函數:

Recv函數和read函數提供了read和write函數一樣的功能,不同的是他們提供了四個參數。

Int recv(int fd,void *buf,int len,int flags)

Int send(int fd,void *buf,int len,int flags)

前面的三個參數和read、write函數是一樣的。第四個參數可以是0或者是一下組合:

? MSG_DONTROUTE:不查找表

是send函數使用的標志,這個標志告訴IP,目的主機在本地網絡上,沒有必要查找表,這個標志一般用在網絡診斷和路由程序里面。

? MSG_OOB:接受或者發生帶外數據

表示可以接收和發送帶外數據。

? MSG_PEEK:查看數據,并不從系統緩沖區移走數據

是recv函數使用的標志,表示只是從系統緩沖區中讀取內容,而不清楚系統緩沖區的內容。這樣在下次讀取的時候,依然是一樣的內容,一般在有過個進程讀寫數據的時候使用這個標志。

? MSG_WAITALL:等待所有數據

是recv函數的使用標志,表示等到所有的信息到達時才返回,使用這個標志的時候,recv返回一直阻塞,直到指定的條件滿足時,或者是發生了錯誤。

轉載于:https://www.cnblogs.com/davidsguo008/p/3591522.html

總結

以上是生活随笔為你收集整理的write/read/send/receive函数比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。