套接字的recv返回错误和处理

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时不做处理,等待下次接受直到错误


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值