【Socket網絡編程】recv()與send()的返回值

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

0、recv會先等待套接字s的發送緩衝中的數據被協議傳送完畢,如果協議在傳送s的發送緩衝中的數據時出現網絡錯誤,那麼recv函數返回SOCKET_ERROR(= -1)

如果s的發送緩衝區中沒有數據或者數據被協議成功發送完畢後,recv再檢查套接字s的接收緩衝區,如果s接收緩衝區中沒有數據或者協議正在接收數據,那麼recv就一直等待,直到協議把數據接收完畢。

當協議把數據接收完畢,recv函數就把s的接收緩衝中的數據copy到buf中(注意協議接收到的數據可能大於buf的長度,所以 在這種情況下要調用幾次recv函數才能把s的接收緩衝中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的)。

1、recv函數返回其實際copy的字節數

2、如果recv在copy時出錯,比如buf內存不足,那麼它返回SOCKET_ERROR(= -1)

3、如果recv函數在等待協議接收數據時網絡中斷了,通常爲另一端關閉了連接,那麼它返回0

recv()函數默認爲阻塞狀態,即一切正常的情況下,recv()未收到數據時會一直等待;

當藉助setsocketopt()函數設置超時時間後,recv爲非阻塞狀態;  若recv()超時未收到數據,也會返回SOCKET_ERROR(= -1)

注意:當網線被拔、對方掉線等物理層網絡問題突然出現,recv不會收到任何反饋。若爲阻塞狀態,則會一直等待;若爲非阻塞狀態,則會超時返回SOCKET_ERROR(= -1)從而得知網絡異常中斷。

 

2、int send( SOCKET s,  char  *buf,  int len,  int flags);

1、如果send函數copy數據成功,就返回實際copy的字節數

2、如果send在copy數據時出現錯誤,比如len大於s的發送緩衝區的長度,那麼send就返回SOCKET_ERROR(= -1)

3、如果send在等待協議傳送數據時網絡斷開的話,通常指另一方關閉套接字,那麼send函數也返回SOCKET_ERROR(= -1)

注意:當網線被拔、對方掉線等物理層網絡問題突然出現,send不會收到任何反饋,依舊會不停的copy數據,返回copy的字節數。這種情況需要TCP的心跳機制,及時得知網絡異常中斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章