recv函式和send函式返回值錯誤處理

2021-10-07 05:48:35 字數 1361 閱讀 6909

本文中分析的都是非阻塞態的socket錯誤**,因為阻塞態也不會出現ewouldblock錯誤。

返回值<0時並且(errno == eintr || errno == ewouldblock || errno == eagain)的情況下認為連線是正常的,繼續接收。

socket設定為非阻塞的時候,recv返回錯誤時才會有 errno == ewouldblock || errno == eagain兩種情況;

因為巨集定義ewouldblock和 eagain ,所以二者等價;

放在此處的意思是,本來應該阻塞,卻沒有阻塞。(也就是並沒有發生阻塞,原因是設定了非阻塞態,也就說這個錯誤是在非阻塞態時才會有的)

ewouldblock的意思是如果你不把socket設成非阻塞(即阻塞)模式時,這個讀操作將阻塞,也就是說資料還未準備好(但系統知道資料來了,所以select告訴你那個socket可讀)。使用非阻塞模式做i/o操作的細心的人會檢查errno是不是eagain、ewouldblock、eintr,如果是就應該重讀,一般是用迴圈。如果你不是一定要用非阻塞就不要設成這樣,這就是為什麼系統的預設模式是阻塞。

int foo(socket socket, char *buff, int length)

if(nread < 0)

nleft -= nread;

buff += nread;

}return(length - nleft);

}

如示例,recv函式是不能通過返回值來判斷讀滿了buff個資料的,因為recv返回0表示,對端socket正常關閉了。所以,需要通過判斷未讀的位元組數》0?來解決這個問題。

int foo(socket socket, char *buff, int length)

if(nsend < 0)

nleft -= nsend;

buff += nsend;

}return(length - nleft);

}

3、附錄recv函式errno值

send函式errno值

recv函式和send函式

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

recv函式和send函式

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

send函式和recv函式

1.send 函式 int send socket s,const char far buf,int len,int flags 不論是客戶還是伺服器應用程式都用send函式來向tcp連線的另一端傳送資料。客戶程式一般用send函式向伺服器傳送請求,而伺服器則通常用send函式來向客戶程式傳送應答。...