socket程式設計 recv 返回值處理

2021-05-11 06:27:59 字數 815 閱讀 4516

一般在經典的socket教程中,呼叫send()和recv()時都會判斷一下返回值,如果返回值是-1(或者socket_error),那麼就進行錯誤處理(一般是列印出錯資訊,關閉socket,退出)。在我的乙個專案中我因為嫌麻煩就想當然沒有判斷send和recv的返回值,結果遇到了點小麻煩。

簡單地說明一下問題:

伺服器端支援多執行緒,每個執行緒用while(1)迴圈地接收客戶端的請求並加以處理;客戶端傳送請求後,關閉socket,退出。pretty straight forward,uh?

出現的問題是,就算客戶端只傳送一條請求,伺服器還是能一直接收到請求,如果在recv()函式後列印出接收的資訊,也是能打

印出的:

while(1)

{recv(socket, buf, 128,0);

printf("%s/n",buf);

假設客戶只傳送了一條"hello",那麼伺服器端就會一直不停地列印出"hello"。

我開始時很奇怪,首先,recv()如果接收不到資訊不是應該阻塞嗎?照這樣說,伺服器應該接收到一次「hello」後就阻塞在那裡了;其次,為什麼每次都會列印出同樣的資訊呢?

後來發現原因很簡單。

1. 客戶端關閉後,recv()函式會一直返回-1,這就是recv()沒有阻塞的原因。(也就是說recv()已經執行了,只不過失敗了)

2. 因為recv()的失敗,buf的內容就一直不會變。所以列印出的buf的內容其實一直都是第一次buf的內容"hello",而並不是說伺服器能夠一直接收到"hello"這條資訊。

就是這樣!原因很簡單,不過也讓我搗鼓了一陣子。so, 大家以後用到socket程式設計時,千萬不要偷懶哦!

recv 的返回值

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

recv函式返回值

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

recv函式返回值說明

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