函數原型:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
該函數第一個參數制定接收端套接字描述符;
第二個參數指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據;
第三個參數指明緩沖區buf的長度;
第四個參數一般置0; (標志位)
recv函數返回其實際copy的字節數。如果recv在copy時出錯,那么它返回SOCKET_ERROR; 如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0;
recv函數僅僅是copy數據, 真正的接收數據是協議來完成的。
默認recv函數socket 是阻塞的
阻塞與非阻塞recv返回值沒有區分,都是
<0 出錯
=0 連接關閉
>0 接收到數據大小,
特別:返回值<0時並且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況下認為連接是正常的,繼續接收。
只是阻塞模式下recv會阻塞着接收數據,非阻塞模式下如果沒有數據會返回,不會阻塞着讀,因此需要循環讀取)。
返回說明:
成功執行時,返回接收到的字節數。另一端已關閉則返回0。失敗返回-1,errno被設為以下的某個值
EAGAIN:套接字已標記為非阻塞,而接收操作被阻塞或者接收超時
EBADF:sock不是有效的描述詞
ECONNREFUSE:遠程主機阻絕網絡連接
EFAULT:內存空間訪問出錯
EINTR:操作被信號中斷
EINVAL:參數無效
ENOMEM:內存不足
ENOTCONN:與面向連接關聯的套接字尚未被連接上
ENOTSOCK:sock索引的不是套接字
當返回值是0時,為正常關閉連接;