广州在线网站制作,学c还是网站开发,做外贸公司网站,数据库性质的网站怎么做recv是socket编程中最常用的函数之一#xff0c;在阻塞状态的recv有时候会返回不同的值#xff0c;而对于错误值也有相应的错误码#xff0c;分别对应不同的状态#xff0c;下面是我针对常见的几种网络状态的简单总结。首先阻塞接收的recv有时候会返回0#xff0c;这仅在对… recv是socket编程中最常用的函数之一在阻塞状态的recv有时候会返回不同的值而对于错误值也有相应的错误码分别对应不同的状态下面是我针对常见的几种网络状态的简单总结。首先阻塞接收的recv有时候会返回0这仅在对端已经关闭TCP连接时才会发生。而当拔掉设备网线的时候recv并不会发生变化仍然阻塞如果在这个拔网线阶段socket被关掉了后果可能就是recv永久的阻塞了。 所以一般对于阻塞的socket都会用setsockopt来设置recv超时。当超时时间到达后recv会返回错误也就是-1而此时的错误码是EAGAIN或者EWOULDBLOCKPOSIX.1-2001上允许两个任意一个出现都行所以建议在判断错误码上两个都写上。如果socket是被对方用linger为0的形式关掉也就是直接发RST的方式关闭的时候recv也会返回错误错误码是ENOENT还有一种经常在代码中常见的错误码那就是EINTER意思是系统在接收的时候因为收到其他中断信号而被迫返回不算socket故障应该继续接收。但是这种情况非常难再现我尝试过一边一直在不停的发信号一边用recv接收数据也没有出现过。这种异常错误我附近只有一个朋友在用write的时候见到过一次但是总是会有概率出现的所以作为完善的程序必须对此错误进行特殊处理。 一般设置超时的阻塞recv常用的方法都如下
while(1)
{cnt (int)recv(m_socket, pBuf,RECVSIZE, 0);if( cnt 0 ){;//正常处理数据}else{if((cnt0) (errno EAGAIN||errno EWOULDBLOCK||errno EINTR)) //这几种错误码认为连接是正常的继续接收continue;//继续接收数据}break;//跳出接收循环
}阻塞与非阻塞recv返回值没有区分都是 0 出错 0 连接关闭 0 接收到数据大小。 Linux环境下须如下定义
struct timeval timeout 3,0;
//设置发送超时
setsockopt(socketSOL_SOCKET,SO_SNDTIMEO(char *)timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socketSOL_SOCKET,SO_RCVTIMEO(char *)timeout,sizeof(struct timeval));