2011-07-10 17 views
1

からクライアントの接続が切断私は新しいスレッドで.NETソケットの問題:サーバー側でサーバー

static void ListenForConsultant() 
    { 
     while (true) 
     { 
      var serverSocket = new TcpListener(IPAddress.Any, 2111); 
      serverSocket.Start(); 
      var clientSocket = serverSocket.AcceptTcpClient(); 
      consultantConnected = true; 
      Console.WriteLine(" >> Consultant Connected"); 
      byte[] bytesFrom = new byte[10025]; 
      while (true) 
      { 
       if (!clientSocket.Connected) 
       { 
        break; 
       } 
       NetworkStream networkStream = clientSocket.GetStream(); 
       bytesFrom = new byte[10025]; 
       networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
       var dataFromConsultant = System.Text.Encoding.ASCII.GetString(bytesFrom); 
       if (dataFromConsultant.IndexOf("~") != -1 && dataFromConsultant.IndexOf("^") != -1 && dataFromConsultant.IndexOf("^") > dataFromConsultant.IndexOf("~")) 
       { 
        var lengthOfMessage = dataFromConsultant.IndexOf("^") - dataFromConsultant.IndexOf("~") - 1; 
        dataFromConsultant = dataFromConsultant.Substring(dataFromConsultant.IndexOf("~") + 1, lengthOfMessage); 
        Console.WriteLine(" >> From consultant:" + dataFromConsultant); 
       } 

      } 

      consultantConnected = false; 
      Console.WriteLine(" >> Consultant Disconnected"); 

      serverSocket.Stop(); 
     } 
    } 

を実行し、このコードを持っているdoesnの私はすべてがうまく動作ポート2111にパテを使用して接続するが、私はパテソケットを閉じたとき「トン近くには、しかし、私は条件

if (!clientSocket.Connected) 
{ 
     break; 
} 

デバッグclientSocket.Connectedは、私は、サーバーから切断された後も、真実であることを私に示しています。

どうしてですか?

答えて

2

tcpClient.Connectedプロパティ値は信頼できません。最後の通信に応じて値が異なります。最後の通信が成功した場合はtrue、そうでなければfalseです。その確認の詳細についてはthisを参照してください。

使用この接続されているプロパティをれるtcpClientが接続されているかどうかを確認するには:

public static bool IsConnected 
{ 
    get 
    { 
     try 
     { 
      //return _tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected; 

      if (_tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected) 
      { 

       /* As the documentation: 
        * When passing SelectMode.SelectRead as a parameter to the Poll method it will return 
        * -either- true if Socket.Listen(Int32) has been called and a connection is pending; 
        * -or- true if data is available for reading; 
        * -or- true if the connection has been closed, reset, or terminated; 
        * otherwise, returns false 
        */ 

       // Detect if client disconnected 
       if (_tcpClient.Client.Poll(0, SelectMode.SelectRead)) 
       { 
        byte[] buff = new byte[1]; 
        if (_tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0) 
        { 
         // Client disconnected 
         return false; 
        } 
        else 
        { 
         return true; 
        } 
       } 

       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 

編集:IsConnectedをチェックすることが確認後切断からそれを防止しないこと。すなわちソケットが接続直後に "IsConnected検査が評価されて真を返す"の直後に切断される可能性があるので、いつでもソケットを切断することを期待してtry/catchまたはtry/catch/finallyブロック内のすべての通信をラップする必要があります。

+0

このプロパティの代わりにクライアントの状態を判断するにはどうすればよいですか? – takayoshi

+0

は答えを更新しました:コード[前回の回答から](http://stackoverflow.com/questions/6452992/tcpclient-disconnect-during-async-read/6455369#6455369)。 –

関連する問題