Linux下客户端主动Close,服务端阻塞的read函数不会马上返回
2016-05-27 00:24
686 查看
今天在做一个socket通信的时侯,发现close后,阻塞的read函数并没有马上返回,导致后面的时序出现问题,具体情况如下:
服务端与客户端正常建立通信,都采用阻塞模式。当客户端close后,服务端阻塞的read函数并没有马上返回,并且此时在服务端还可以向此连接写入数据,并成功,然后客户端又成功读到数据,接着服务端阻塞的read函数返回<0,表示断开连接。
以上客户端主动Close,服务端阻塞的read函数没有马上返回的现象与理想不符。后查阅,发现windows与linux在这点上不一样,在window是上,closeSocket,阻塞的recv函数会马上返回,但是linux上并不是这样。
为解决这个问题,尝试了如下方法:
1. int shutdown(int sockfd,int how); 此函数可禁止在一个套接口上进行数据的接收与发送。其他博客有说明,在close前调用此函数可以使阻塞的read函数立即返回,但是我每调用此函数机器会重启,这里并不知道具体原因,所以放弃了这个方法。
2. 设置LINGER参数,setsockopt(socket_fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger); 将延时参数设置为0,强制关闭套接口;但是结果并不理想,也放弃;
3. 在客户端欲关闭连接之前,先发送一个自定义消息,客户端再close,服务端收到该标志消息后也close,于是正常断开连接;个人觉得,此方法虽然能够解决问题,但总是觉得很牵强。但是最钟还是采用了这种方式。
服务端与客户端正常建立通信,都采用阻塞模式。当客户端close后,服务端阻塞的read函数并没有马上返回,并且此时在服务端还可以向此连接写入数据,并成功,然后客户端又成功读到数据,接着服务端阻塞的read函数返回<0,表示断开连接。
以上客户端主动Close,服务端阻塞的read函数没有马上返回的现象与理想不符。后查阅,发现windows与linux在这点上不一样,在window是上,closeSocket,阻塞的recv函数会马上返回,但是linux上并不是这样。
为解决这个问题,尝试了如下方法:
1. int shutdown(int sockfd,int how); 此函数可禁止在一个套接口上进行数据的接收与发送。其他博客有说明,在close前调用此函数可以使阻塞的read函数立即返回,但是我每调用此函数机器会重启,这里并不知道具体原因,所以放弃了这个方法。
2. 设置LINGER参数,setsockopt(socket_fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger); 将延时参数设置为0,强制关闭套接口;但是结果并不理想,也放弃;
3. 在客户端欲关闭连接之前,先发送一个自定义消息,客户端再close,服务端收到该标志消息后也close,于是正常断开连接;个人觉得,此方法虽然能够解决问题,但总是觉得很牵强。但是最钟还是采用了这种方式。
相关文章推荐
- linux篇——centOs下的vim配置
- linux下vim的配置及插件安装
- Linux之编辑器Vim篇(配置与高级技巧)
- Centos6.5和Centos7 php环境搭建方法
- linux下升级python版本
- Linux系统下安装rz/sz命令及使用说明
- Linux 命令
- 如何注销Linux下的用户
- 盘点几款linux平台上的国产软件
- centos6.5和centos7如何搭建php环境
- linux开机自启动命令
- Ubuntu(Linux)使用Eclipse搭建C/C++编译环境
- Linux中环境变量文件及配置
- Linux下使用fdisk扩展分区容量
- 配置Linux自动挂载
- Centos优化Hadoop
- Linux使用Eclipse开发C/C++环境配置
- linux下c语言编程exec函数使用
- linux facl
- linux 多线程聊天服务器