局域网SOCKET通信(TCP)需要心跳包来保持长连接么

偶然看到,免得忘了,拿来主义,知道结果即可,不追究


链接如下,在第7楼

http://cache.baidu.com/c?m=9d78d513d98510ed4fece4697c66c0171b4381132ba6d3020ca58438e5732d405321a3e52878564291d27d141cb20c19afe73605705862eade9fc85dddccc375709577643101c01b52844af9dc4653c2259559eeaf0ee7ccf32593d8d1c4df23098c0c5b&p=937fc54ad08116ea0be2932c4b&user=baidu&fm=sc&query=tcp%CB%C0%C1%AC%BD%D3&qid=c7099cd305983c17&p1=20

套接字本身是有一套心跳保活机制的,不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。

很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机制只是操作系统底层使用的一个被动机制,原理上不应该被上层应用层使用。当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动通知上层应用的,只有在调用相应的IO操作在返回值中检查出来。

因此,忘记SO_KEEPALIVE,在应用层自己写一套保活机制比较靠谱。

posted @ 2011-07-24 17:43  飞天大蟾蜍  阅读(10)  评论(0编辑  收藏  举报