或者客户端不发心跳包,直接掉线,服务端怎么知道

解决方案 »

  1.   

    closesocket()的话可以知道,服务端会收到消息在onclose里处理。直接掉线不知道,这时很容易出错。
    因此建议发心跳包.
      

  2.   

    用TCP建立连接的客户端,在调用closesocket时,会向服务器端发送Fin包,所有服务器端会
    知道客户端要断开了,这时,服务器端TCP协议栈会通知上层的。
    如果中间突然断掉,比如说需经过路由器的,这是路由器没电了等等,客户端跟服务器端是
    根本不知道的。所以要防止这种情况,需要定时向一方发送相关的数据,另一方返回应答。
    如果在指定的时间内没返回应答,可视为断开。
      

  3.   

    心跳包我知道了,我想知道 lianglp() ( ) 说的“在调用closesocket时,会向服务器端发送Fin包,所有服务器端会知道客户端要断开了”
    这个怎么实现,给点参考的东西,谢谢
      

  4.   

    大家帮下忙,这个fin包怎么检测
      

  5.   

    比如 ServerSocket与客户端连接,看ServerSocket是否等于SOCKET_INVALID 若是则客户端关闭,否则没有关闭
      

  6.   

    用select() 如何检测,谢谢
      

  7.   

    好像是不是有个FD_CLOSE的消息,不太清楚select可不可以检测这个通知。
      

  8.   

    if( select() )
    {
       int nResult = recv();
       if( nResult < 0 )
       {
            //断开了
       }
       else if(nResult == 0) 
       {
          if( GetLastError() == 0 )
          {
            //断开了
          }
       }
    }
      

  9.   

    不一定全对,不过你可以参考参考:判断客户端是否断开
    http://www.xiaozhou.net/cooldog/blogview.asp?logID=96