在异步套接字中,如何判断客户端已经关闭或断开?
要求在服务器判断,不用定时器(如果有很多客户端就不好搞了)。

解决方案 »

  1.   

    正常关闭是不需要判断的,接受数据时会提示出错,但网络问题就无法判断了不过TCP本身是带心跳包的,可以设置KeepAlive,系统自动心跳包
      

  2.   

    异步socket处理对象,如果它失去了任何程序连接(连底层回调方法都被抛弃了),那么此Socket自动就被GC回收了。你判断它干什么用呢?反而让GC无法回收它们。
      

  3.   

    实在是搞不懂你的意思。再一句话中,前半句跟后半句明显是逻辑矛盾的,又要“判断”又不要“定时判断”,不知道你要“何时判断”!一般来说,就算你需要将Socket(或者TcpClient)保存在一个集合中,你也无须定时判断。根本不用管它,仍在你的集合就好了。这能占多大内存?要去清理?如果你需要给所有客户端发送什么消息,此时再判断一下是否连接,或者也不用判断而直接进行Send操作。如果Send时出错,就直接把它Close然后从你的集合中删除就行了。只有在下一次Send信息时才需要处理。之前不需要去提前去判断什么连接性。
      

  4.   

    1.客户端正常断开:在receive事件完成的回调里会发现从流中读出的是0字节,这是客户端主动断开服务器端的现象。
    2.客户端意外断开:参考
      

  5.   


    谢谢,我在网上也看到了这样的代码。
    可不可以这样理解,如果客户端断开,其会立即向服务端发送断开连接请求。此时,服务端在结束挂起的异步读取时,会返回0字节。
      try   
                {   //结束挂起的异步读取,返回接收到的字节数
                    
                    nBytesRec   =   m_sock.EndReceive(   ar   );                
                }   
                catch{}   
      

  6.   

    这种是上面的情况1,客户端主动close了,双方四次挥手均完成。但往往需要更多的处理第二种情况