本文中分析的都是非阻塞態的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函式來向客戶程式傳送應答。...