我用socket类开发时怎么知道对方已经关闭了?

解决方案 »

  1.   

    对方调用socket.shutdown(both);socket.close();时另一方有什么反应??如果对方是非法关闭的话另一方有什么反应?
      

  2.   

    可以试试POLL方法
    微软的文档是这样描述poll方法的
    “Poll 方法将会检查 Socket 的状态,此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。您必须尝试发送或接收数据以检测这些类型的错误。

    下面的代码示例会创建套接字,连接到服务器并使用 Poll 检查套接字的状态。
    //Creates the Socket for sending data over TCP.
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
       ProtocolType.Tcp );
     
    // Connects to host using IPEndPoint.
    s.Connect(EPhost);
    if (!s.Connected)
    {
       strRetPage = "Unable to connect to host";
    }
    // Use the SelectWrite enumeration to obtain Socket status.
     if(s.Poll(-1, SelectMode.SelectWrite)){
          Console.WriteLine("This Socket is writable.");
     }
     else if (s.Poll(-1, SelectMode.SelectRead)){
            Console.WriteLine("This Socket is readable." );
     }
     else if (s.Poll(-1, SelectMode.SelectError)){
          Console.WriteLine("This Socket has an error.");
     }
      

  3.   

    我是调用异步连接和接收,我想知道有没有像winapi那样有关闭事件??
      

  4.   

    问题的关键是,对方(LISTEN)关闭时,send是可以成功的,只有recv才会保错,此时,很难有在一个与业务无关的系统中,重新调用 send发送数据,解决问题最好的方法是在send之间能检测通信是否正常。