是丌可以这样做,在客户端断开之前,发一个自定义的命令比如“disConnect”给server,这样server就知道要她断开,然后从客户的列表中删除

解决方案 »

  1.   

    先判段连接啊if(ar != null){
    //;
    }
    if(!socket.IsClosed){
    int countReaded = socket.EndReceive(a);
    if(countReaded > 0){
    socket.AppendBuffer(buffer,countReaded);

    }
    else
    {
    callBack(SocketCallBackResult.SocketClosed,(long)param["readedCount"],null,tag);
    }
      

  2.   

    楼上的方法我试过,但不可以啊。
    ar 并不为空。
    holdingSocket holding = (holdingSocket) ar.AsyncState;
    Socket handler = holding.workSocket;
    这两句都不出问题。
    但这句却出了问题,并且所有的连接都出异常并断开了。
      

  3.   

    首先,你的服务器端是多线程的,就是每多一个客户连接就新开一个线程
    然后,可以使用自定义的协议来通知断开,但是当以外断开时,就必须使用try-catch来捕捉错误并处理意外断开的错误了(结束线程。)
      

  4.   

    我在异常代码块里用 Application.existThread 结果所有的连接都断开了.
    还是那样,客户端意外或偶然断开后,服务器端还是会回调一次 public void ReadCallback(IAsyncResult ar)而在 int bytesRead = handler.EndReceive(ar); 这一句时 handler 因为是已经断掉的.而抛出异常
    结果是把所有的连接都给断开了.郁闷啊.........
      

  5.   

    如果就这么一种意外情况,还是用try..catch