异步Socket在关闭以后出错。
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!

解决方案 »

  1.   

    private void ThreadFunc()
    {
    IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,iPort);
    try
    {
    sSocket.Bind(ipEndPoint);
    sSocket.Listen(10);
    }
    catch
    {
    MessageBox.Show("网络服务启动失败");
    return;
    }
    while(bRun == true)
    {
    tEvent.Reset();
    sSocket.BeginAccept(new AsyncCallback(MessageFunc),sSocket);
    tEvent.WaitOne();
    Thread.Sleep(200);
    }
    eEvent.Set();
    }
                       private void MessageFunc(IAsyncResult ar)
    {
    tEvent.Set();
    Socket sSocket = (Socket)ar.AsyncState;
    Socket cSocket = sSocket.EndAccept(ar);
    byte[] sendBuffer = new byte[1024];
    cSocket.Receive(sendBuffer);
    string str = Encoding.Default.GetString(sendBuffer);
    byte[] receiveBuffer = new byte[1024];
    receiveBuffer = Encoding.Default.GetBytes("收到" + str);
    cSocket.Send(receiveBuffer);
    cSocket.Shutdown(SocketShutdown.Both);
    cSocket.Close(); }
                       public void Stop()
    {
    bRun = false;
    if(tEvent.WaitOne(1000,true) == false)
    {
    tEvent.Set();
    }
    eEvent.WaitOne();
    tEvent.Close();
    eEvent.Close();
    sSocket.Close();
                                //成功结束后抛出异常
    }
      

  2.   

    应该是 socket 关了以后还 试图 接受连接 导致出错吧
      

  3.   

    知道答案了。
    Accept之前一定要先Poll无论是同步还是异步,看看有没有请求的连接,如果有就Accept。如果没有Poll则Socket服务会一直阻塞监听,如果这时Close,就会抛出异常。
    MSDN的实例几乎没有Socket服务的Close,所以没有用到Poll这个方法。
    谢谢楼上的兄弟们了!