我想问一下.我现在也是做socket通信的.我的服务器端也和你的差不多.也是差步连接.异步接收.可是当我的客户端一断开连接.我不知道我应该如何去关掉我的这个sokcet连接.你是怎么处理的.谢谢!
   private void ReceiveCallBack(IAsyncResult ar)
        {
            //从输入参数异步state对象中获取state和socket对象
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.worksocket;
            //从远程设备读取数据
            try
            {
                int bytesRead = client.EndReceive(ar);
                if (bytesRead > 0)
                {
                    //有数据,存储.
                    state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
                    //继续读取
                    // client.BeginReceive(state.buffer, 0, StateObject.buffersize,0,new AsyncCallback(ReceiveCallBack), state);
                  
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.ToString());
            }
            //所有数据读取完毕
            if (state.sb.Length > 0)
            {
                Console.WriteLine(state.sb.ToString());
                //string msg = "我收到了!";
                //Send(client, msg);
            }        }我试着在catch里关了一下.可是我服务器端就接不到第二个客户端的连接了.高手指教一下!

解决方案 »

  1.   

    关什么呢?一旦不可能有ReceiveCallBack回调发生了,那么也就不可能有ar环境了,那么你所保存的state(变量引用的) 对象也就成为了没有线程关联的对象,换句话说就是垃圾回收GC给你去调用对象的Finally释放代码来清理了。
      

  2.   

    至于为什么注释掉 client.BeginReceive代码,你自己解释一下?!
      

  3.   

    至于说“第一个客户端连接出错,就无法接受第二个客户端的连接”:接受客户端连接,这应该是 BeginAccept/EndAccept 来做的事,在没有接受完第一个客户端连接的数据之前,就可以接收完第二个客户端的连接数据,这才叫做异步编程嘛!你怎么用异步代码反到搞出了同步、顺序的东西来了?
      

  4.   

    因为还有一个方法已经在循环接收了.这个就显得多余了,
    另外我想问一下专家。我现在是一个服务器接收。开了两个客户端。一切正常。可是我把一个客户端关掉
    我再去连接时就发生了异常:
    由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作
    我搜了一下。可能是因为socket 连接没有释放!
      

  5.   

    打错字了。是之后服务器只能和第一个通信。其它的都不能写入了,
    我是在BeginAccept处接到的异常.
    能不能再指点一下。谢谢sp1234专家的热心帮助!
      

  6.   

    好象学习Socket通讯都遇到过各种各样类似的问题,高手们怕我们印象不深,一般不会说得太细,需要我们自己去摸、去索的。作为低手,我不知道楼主是如何设计的,我愿说一下自己的思路,不知道楼主愿不愿听了……
      

  7.   

    愿意听.真的愿意,谢谢diffmaker!