2016-10-26 12 views
0

IPアドレスとポート番号を使用してリモートホストへの接続を確立しようとしています。私は、コードで接続を閉じようとただしたときに接続が(でもCMD netstatコマンドを使用して検証)を設立しますん:リモートホストへの接続後にTcpClientがハングし、アプリケーションがフリーズします。C#

clientConnection.Client.Close(); 
clientConnection.Client.Dispose(); 
clientConnection.Close(); 

プログラムがクラッシュソケットがクライアントストリームから読み取られるすべての利用可能なデータがないため。私のWindowsアプリケーション(クライアント)には、ConnectToFalconメソッドを呼び出すためにクリックするボタンがあり、そのメソッドはReadStreamメソッドを呼び出します。どこが間違っているのか教えてください。

public void readStream(object argument) 
    { 

      clientConnection = (TcpClient)argument; 
      //TcpClient client = new TcpClient(); 

      DateTime start_time = DateTime.Now; 
      TimeSpan delay = new TimeSpan(0, 0, 10); 
      while (clientConnection.Available == 0) 
      { 
       Application.DoEvents(); 
       if (DateTime.Now.Subtract(start_time) > delay) 
        break; 
      } 


      if ((clientConnection != null) && (clientConnection.Available > 0)) 
      { 
       var message = new byte[1]; 
       Array.Resize(ref message, clientConnection.Available); 
       //remove below two lines and if-statement block if program crashes 
       clientConnection.Client.ReceiveTimeout = 20000; //Timeout after 20 seconds 
       clientConnection.SendTimeout = 20000; 
       if (clientConnection.Client.ReceiveTimeout <= 20000 || clientConnection.SendTimeout == 20000) 
       { 
        clientConnection.Client.Receive(message); 
        string testResult = System.Text.Encoding.Default.GetString(message); 
       } 
       else 
       { 
        MessageBox.Show("Time expired before read operation completed."); 
       } 
      } 
      else if (((clientConnection == null) && (clientConnection.Available <= 0)) || (clientConnection.Connected == false)) 
      { 
       clientConnection.Close(); 
       MessageBox.Show("Closing client connection due to insufficient amount of data available to be read"); 
      } 

      //clientConnection.Client.Close(); 
      //clientConnection.Client.Dispose(); 
      //clientConnection.Close(); 
     }} 


    public void ConnectToFalcon(string IPaddress, int port) 
    { 

      clientConnection = new TcpClient(); 
      //var result = clientConnection.BeginConnect(IPaddress, port, new AsyncCallback(callback), clientConnection); 
      var result = clientConnection.BeginConnect(IPaddress, port, null, null); 
      var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); 

      if (success == false) 
      { 
       MessageBox.Show("Failed to connect"); 
      } 
      else 
      { 
       MessageBox.Show("Client connected..."); 
       while (true) 
       { 
        Thread t = new Thread(readStream); 
        t.Start(clientConnection); //A new thread is spawned 
        //t.Start(); 
       } 
      }  
    } 

enter image description here

+3

'(clientConnection == null)を認識するために、コールバック関数では、IAsyncResultにEndConnectを呼び出す必要があります&&(clientConnection.Available <= 0) 'これは正しく表示されません。 –

+0

私はネットワークから受信したデータの量を確認しています。 –

+0

しばらくは削除してください(真)。なぜそれが必要なのかわかりません... – Seabizkit

答えて

1

@Luaanによると、あなたはクライアントrequest.`

public void callback(IAsyncResult ar) 
    { 
     this.clientConnection.EndConnect(ar); 
    } 

    var result = clientConnection.BeginConnect(ip, port, new AsyncCallback(callback), clientConnection);