本帖最后由 VisualEleven 于 2011-03-14 11:22:51 编辑

解决方案 »

  1.   

    1 链路双方间隔一段时间,通过心跳激活包,来确定双方还是 live 活的,以便可以随时通信。
      

  2.   

    请教大家两个问题,
    第一,我们为什么需要心跳包,一个tcp连接的一方意外断开时,另一端不会recv到一个socket_error吗?
    为什么需要心跳包来一直不停的检测呢?心跳包保证你知道对方网络状态是良好的第二,SO_KEEPALIVE选项是否可以理解为内核帮我们做的一种心跳包机制?SO_KEEPALIVE有诊断意思,说心跳似乎也不是.
      

  3.   

    心跳用来检测对方的活动性
    一般的网络错误,TCP/IP协议可以检测出来,但是一些特殊情况,比如拔掉网线,机器宕机,中间路由停机等情况,协议是检测不出来的,所以必须要通过心跳来检测。
    SO_KEEPALIVE选项是TCP用来检测对方活性的方法,但是这个检测的时间太长,一般是两个小时以上才开始激活这个选项,你如果能接受的话,就用这个也没啥问题
      

  4.   

    SO_KEEPALIVE选项的确时效性不行。。时间太长了
      

  5.   

    楼上说的很好,不过我说说我理解,心跳包是应用层协议,一旦网络错误,可以检测出来,而SO_KEEPALIVE选项的这套机制是操作系统底层使用的被动机制,原理上不推荐我们在上层应用层去使用它,当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动去通知上层如应用层的,只有调用相应的IO操作的返回值中检查出来。所以还是得在应用层自己定义心跳包,占用资源少,清除死连接作用很大。
      

  6.   


    一.确实不会,以外断开如:拔网线,直接断电,中间路由器损坏二.是的,正常2小时触发一次看下文章:
    http://blog.csdn.net/jwybobo2007/archive/2011/01/25/6162784.aspx