Linux下客户端主动Close,服务端阻塞的read函数不会马上返回

今天在做一个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,于是正常断开连接;个人觉得,此方法虽然能够解决问题,但总是觉得很牵强。但是最钟还是采用了这种方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值