recv函式的用法詳解

2021-07-03 15:31:08 字數 685 閱讀 9140

recv函式

int recv( socket s,     char far *buf,      int len,     int flags     );   

不論是客戶還是伺服器應用程式都用recv函式從tcp連線的另一端接收資料。

該函式的第乙個引數指定接收端套接字描述符;

第二個引數指明乙個緩衝區,該緩衝區用來存放recv函式接收到的資料;

第三個引數指明buf的長度;

第四個引數一般置0。

這裡只描述同步socket的recv函式的執行流程。當應用程式呼叫recv函式時,recv先等待s的傳送緩衝中的資料被協議傳送完畢,如果協議在傳送s的傳送緩衝中的資料時出現網路錯誤,那麼recv函式返回socket_error,如果s的傳送緩衝中沒有數 據或者資料被協議成功傳送完畢後,recv先檢查套接字s的接收緩衝區,如果s接收緩衝區中沒有資料或者協議正在接收資料,那麼recv就一直等待,只到 協議把資料接收完畢。當協議把資料接收完畢,recv函式就把s的接收緩衝中的資料copy到buf中(注意協議接收到的資料可能大於buf的長度,所以 在這種情況下要呼叫幾次recv函式才能把s的接收緩衝中的資料copy完。recv函式僅僅是copy資料,真正的接收資料是協議來完成的),recv函式返回其實際copy的位元組數。如果recv在copy時出錯,那麼它返回socket_error;如果recv函式在等待協議接收資料時網路中斷了,那麼它返回0

奇怪的recv函式

一直有個錯覺,以為recv的函式返回值 0是有資料讀到,0是無資料,0是連線關閉等錯誤。結果最近做了個server,發現檢測不到對端連線關閉,才知道犯了個天大的錯誤,而原因就是recv的返回值的怪異。從下文才知道,即使前面select read控制代碼返回大於0,recv函式返回0竟然是代表連線關閉...

recv函式解析

recv函式 i nt recv socket s,cha r buf,int len,int flags 不論是客戶還是伺服器應用程式都用recv函式從tcp連線的另一端接收資料。該函式的第乙個引數指定接收端套接字描述符 第二個引數指明乙個緩衝區,該緩衝區用來存放recv函式接收到的資料 第三個引...

Socket send函式和recv函式

不論是客戶還是伺服器應用程式都用send函式來向tcp連線的另一端傳送資料。客戶程式一般用send函式向伺服器傳送請求,而伺服器則通常用send函式來向客戶程式傳送應答。該函式的第乙個引數指定傳送端套接字描述符 第二個引數指明乙個存放應用程式要傳送資料的緩衝區 第三個引數指明實際要傳送的資料的位元組...