在Linux中使用非阻塞的socket的情形下
来源:互联网 发布:地图软件有哪些 编辑:程序博客网 时间:2024/05/21 06:15
在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收。
对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF 9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)
对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
因此对于简单的状态判断(不过多考虑异常情况),
recv返回>0, 正常
返回-1,而且errno被置为11 正常
其它情况 关闭
另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。
最后,如果recv的返回值为0,那表明对方已将连接断开,我们的接收操作也应该结束。
accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。
所以使用时应这样:
while(1) {
if ( (connfd = accept(....)) == -1 ) {
if (errno == EINTR)
continue;
perror("accept()");
exit(1);
}
/* do sth with "connfd" */
- 在Linux中使用非阻塞的socket的情形下
- LINUX中SOCKET的阻塞与非阻塞
- Linux下socket非阻塞的一些技巧
- 在非线程阻塞使用socket中,避免控件出现灰色的办法
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Socket的阻塞/非阻塞
- Linux下socket阻塞、非阻塞详解
- 非阻塞的Socket
- linux select阻塞非阻塞的使用
- 使用非阻塞方式的Socket通信
- VC中使用API编写的socket程序中如何设置阻塞和非阻塞
- 【转】linux网络编程中阻塞和非阻塞socket的区别
- linux网络编程中阻塞和非阻塞socket的区别
- C++ inlinie
- socketpair
- Java ScriptEngine解析脚本学习
- 游戏更新-围棋练习大全-Android
- __declspec(dllexport)
- 在Linux中使用非阻塞的socket的情形下
- 【科研论文】基于Zigbee与以太网的智能家居系统设计–基于W5300
- Git命令小记
- Java中的类装载器(ClassLoader)
- cannot load such file -- openssl 用gem安装rails时遭遇的错误
- google play网页改版后查看英文评论的方法
- makefile
- 激光散斑测量
- 流量清洗主要针对的攻击类型