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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

recv函数返回值说明

發布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 recv函数返回值说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

recv函數

int recv( SOCKET s, char FAR *buf, int len, int flags);

不論是客戶還是服務器應用程序都用recv函數從TCP連接的另一端接收數據。

該函數的第一個參數指定接收端套接字描述符;

第二個參數指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據;

第三個參數指明buf的長度; 第四個參數一般置0。

這里只描述同步Socket的recv函數的執行流程。當應用程序調用recv函數時,

(1)recv先等待s的發送緩沖中的數據被協議傳送完畢,如果協議在傳送s的發送緩沖中的數據時出現網絡錯誤,那么recv函數返回SOCKET_ERROR,

(2)如果s的發送緩沖中沒有數據或者數據被協議成功發送完畢后,recv先檢查套接字s的接收緩沖區,

如果s接收緩沖區中沒有數據或者協議正在接收數 據,那么recv就一直等待,直到協議把數據接收完畢。

當協議把數據接收完畢,recv函數就把s的接收緩沖中的數據copy到buf中

(注意協議接收到的數據可能大于buf的長度,所以 在這種情況下要調用幾次recv函數才能把s的接收緩沖中的數據copy完。

recv函數僅僅是copy數據,真正的接收數據是協議來完成的), recv函數返回其實際copy的字節數。

如果recv在copy時出錯,那么它返回SOCKET_ERROR;

如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0。

默認 socket 是阻塞的 解阻塞與非阻塞recv返回值沒有區分,都是 <0 出錯 =0 連接關閉 >0 接收到數據大小

特別:

返回值<0時并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況下認為連接是正常的,繼續接收。

只是阻塞模式下recv會阻塞著接收數據,非阻塞模式下如果沒有數據會返回,不會阻塞著讀,因此需要循環讀取)。

返回說明:

成功執行時,返回接收到的字節數。

另一端已關閉則返回0。

失敗返回-1,

errno被設為以下的某個值

EAGAIN:套接字已標記為非阻塞,而接收操作被阻塞或者接收超時

EBADF:sock不是有效的描述詞

ECONNREFUSE:遠程主機阻絕網絡連接

EFAULT:內存空間訪問出錯

EINTR:操作被信號中斷

EINVAL:參數無效

ENOMEM:內存不足

ENOTCONN:與面向連接關聯的套接字尚未被連接上

ENOTSOCK:sock索引的不是套接字 當返回值是0時,為正常關閉連接;

思考:

當對側沒有send,即本側的套接字s的接收緩沖區無數據,返回值是什么(EAGAIN,原因為超時,待測)


http://hi.baidu.com/passionqiangli/item/505d26fb1021c452c8f33717


總結

以上是生活随笔為你收集整理的recv函数返回值说明的全部內容,希望文章能夠幫你解決所遇到的問題。

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