本帖最后由 oyljerry 于 2012-12-14 17:30:16 编辑

解决方案 »

  1.   

    KEEPALIVE有有效时间是几十分钟的,,所以还是得自己实现心跳包
      

  2.   

    给你我的一点心得。    4、关于心跳信号。心跳,也称之为TCP保活定时器,是为了检测TCP链路的连接状态的。可惜保活并不是TCP规范中的一部分。套接字本身是有一套心跳保活机制的,不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后,并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机制只是操作系统底层使用的一个被动机制,原理上不应该被上层应用层使用。当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动通知上层应用的,只有在调用相应的IO操作在返回值中检查出来。因此,忘记SO_KEEPALIVE,在应用层自己写一套保活机制比较靠谱(自己来设计心跳信号吧)。