拔掉网线时Socket(TCP)的链路检测方法

    最近在做TCP相关的定位数据上传,发现client在与server进行Socket(TCP)通信的时候,若TCP client的应用程序正常或者异常退出时,Server都可以在对应的socket通信链路上获得响应(如返回某个值0,或者抛出异常等);但如果client的网线被拔掉的情况下,那正常情况下,服务器需要经过很长的一段时间才会知道客户端的网线掉了(或者网线被拔掉之后允许的时间段内重新插上,那么TCP Server都不会收到TCP链路断开的响应),这对很多TCP Server应用来说这么长的时间是不允许的,或者都不可能发现Client已经掉线,那么这种情况可以使用“心跳机制”来解决此类问题。
    由于TCP采集程序只是通过长连接来接收消息,而不能与客户端建立心跳机制,所以唯一可行的办法就是设置超时机制,在非阻塞模式工作的情况下,可以通过空闲计数来判断是否连接超时,在连接空闲情况下TCP采集程序会休眠10ms,并且空闲计数器加1,当收到数据时空闲计数器清零,因此当空闲计数达到3000次的时候,说明socket连接在30秒内没有收到数据,此时认为连接超时,主动的断开连接,释放socket资源。

你可能感兴趣的:(开发过程中遇到的相关问题)