阻塞机制下的recv小结
来源:互联网 发布:js 声明 字符串数组 编辑:程序博客网 时间:2024/04/30 15:43
recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。
首先阻塞接收的recv有时候会返回0,这仅在socket被正常关闭时才会发生。
而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。
所以一般对于阻塞的socket都会用setsockopt来设置socket的超时。
当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.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((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR))
{
continue;//继续接收数据
}
break;//跳出接收循环
}
}
首先阻塞接收的recv有时候会返回0,这仅在socket被正常关闭时才会发生。
而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。
所以一般对于阻塞的socket都会用setsockopt来设置socket的超时。
当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.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((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR))
{
continue;//继续接收数据
}
break;//跳出接收循环
}
}
0 0
- 阻塞机制下的recv小结
- 阻塞机制下的recv小结
- 阻塞机制下的recv小结
- 阻塞机制下的recv小结
- 阻塞机制下的recv小结
- 阻塞机制下的recv小结
- 阻塞模式下的send、recv、close
- 阻塞模式下的send、recv、close
- 对阻塞模式下的send、recv、close总结
- 阻塞模式下的send、recv、close总结
- 阻塞模式下的send、recv、close总结
- 阻塞模式下的send、recv、close总结
- 阻塞模式下的send、recv、close总结
- recv和recv from ,send和sendto 在阻塞和非阻塞的情况下的错误码
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 【RFID第二次作业】课后习题第6题
- Lisa随手记 1.8开发日志
- Django学习/问题汇总
- 杭电 HDU 1098 Ignatius's puzzle
- 10313 - Pay the Price
- 阻塞机制下的recv小结
- 操作系统第三次作业
- NPOI操作EXCEL
- js中push和join
- 别做正常的傻瓜
- Scala connecting to MySQL with JDBC
- 操作系统第四次作业
- Android图像处理技术(实现Android中的PS)(六)
- Java网络编程基础之Scoket通信