extern ssize_t recv(int __fd,void *__buf,size_t __n,int __flags);
(1)返回-1是错误
则需要获取错误码errno(win下是通过WSAGetLastError())
如果是EAGAIN或者EWOULDBLOCK则是缓冲区满了,需要继续尝试接受。
ECONNABORTED :An established connection was aborted by the software in your host machine.(建立后的连接被自己机器中断的)
ECONNRESET :An existing connection was forcibly closed by the remote host(连接被对端中断的)
(2)大于0则是接受成功,返回的是获取的字节数
(3)等于0 则是对端断开。处理方式可以回收描述符,也可以作为没有数据接收到,继续接受等到出错后提示错误并退出接受循环。
使用方式是:
int retCode = TEMP_FAULURE_RETRY(::recv(sock,_rev_queue,wr_buf(),_rev_queue.wr_size(),MSG_NOSIGNAL));
if(-1 == retCode && (EAGAIN == errno || EWOULDBLOCK))return 0;//循环以后会继续尝试接受if( retCode > 0){// 这里是处理接受到的数据}
//0 == retCode时不做处理,等待下次接受直到错误