您的位置:首页 > 运维架构 > Linux

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,于是正常断开连接;个人觉得,此方法虽然能够解决问题,但总是觉得很牵强。但是最钟还是采用了这种方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: