当我应用Reactor 和 ACE_Event_Handler 来实现TCP的连接时,我是通过在handle_input()里recv_n()的返回值为-1来判断“连接断开的”。
    但是我发现经常,当服务器或客户端断开了,我却经常不能有效得到断开信息!
    尽管我已经对建立好的sock设置了SO_KEEPALIVE,SO_LINGER,TCP_NODELAY。当然我也设置了ACE_NONBLOCK。    请问怎样才能有效快速判断对方断开?
    另一种情况是假如对方是物理网络断开(未调用sock.close),又如何来快速判断。

解决方案 »

  1.   

    recv_n()的返回值为-1来判断“连接断开的”。
    -------------------------------------------
    -1 是异常断开了。正常情况断开recv返回0 这种情况也要关闭连接。释放资源
      

  2.   

    嗯,我真是惊讶于自己的忘性!
    我以前为这个问题做个考究的,并且也得到你的结论,可是现在居然又忘记了,faint!!另外,对于网络断开,如拔网线怎么有效及时判断?
      

  3.   

    其实在 C++NP2 里面有对这个问题的讲解呢。
    看书还是应该仔细些,并且好书不能只看一篇,有了一定的理解之后再看第二遍第三遍会有更透彻的理解,嗯。C++NP2的第三章附栏13:处理沉默的对端 (handle silent peer)里提到
    recv()返回0或-1来确定连接关闭。
    但对如拔网线类似的断开,应该加上应用级的“heartbeat”机制。