2017-12-06 13 views
-1

私はソケットを初めて使用しています。これはサーバーからデータを送受信するコードです。TcpClientソケットでのエラー処理

このコードクライアントがサーバーからデータを受信できる限り、このコードは正常に動作します。

サーバーが一定時間内に応答を返さない場合、アプリケーションは「応答なし」を送信する必要があります。

recvBufferが空かNULLかどうかをどのように知ることができますか?

現在、recvBufferのif条件が機能せず、アプリケーションが "System.IndexOutOfRangeException error"という結果をもたらす空のバッファを送信しようとします。

class GetSocket 
{  
    public string SocketSendReceive(string server, int port, string cmd) 
    { 
     byte[] recvBuffer = new byte[1024]; 
     TcpClient tcpClient = new TcpClient(); 
     tcpClient.Client.ReceiveTimeout = 200; 

     try 
      { 
       tcpClient.Connect(server, 6100); 

      } 
      catch (SocketException e) 
      { 

       MessageBox.Show(e.Message); 

      } 

      if (tcpClient != null && tcpClient.Connected) 
      { 
       try 
       { 
        tcpClient.Client.Send(Encoding.UTF8.GetBytes(cmd)); 
        tcpClient.Client.Receive(recvBuffer); 

       } 

       catch (SocketException e) 
       { 
        MessageBox.Show(e.ErrorCode.ToString()); 
       } 

       tcpClient.GetStream().Close(); 
       tcpClient.Client.Close(); 
       tcpClient.Client.Dispose(); 
       tcpClient = null; 
       string tmp = Encoding.ASCII.GetString(recvBuffer, 0, recvBuffer.Length); 

       if (recvBuffer != null && recvBuffer.Length > 0) 
       { 
        string[] words = tmp.Split(null); 
        return words[1]; 
       } 
       else 
       { 
        return ("No Answer Received"); 
       } 
      } 
     return null; 
    } 

} 
+1

停止(あなたがそれを変更するには何もしたことがないことから、非nullで、長さが1024バイトで_always_ます)、およびそのすべてのデコードのものは 'しようとして行くあなたのコードをリファクタリング受信バッファを見て'応答("無回答... ")'部分は 'catch'ブロックに入りますが、' Receive() '呼び出しの後でブロックします。スローされる 'SocketException'は、タイムアウトが発生したことを通知するものです。詳細については、[the documentation](https://msdn.microsoft.com/en-us/library/8s4y8aff(v = vs.110).aspx) –

+0

を参照してください。私はあなたから提案された変更を加えました。 –

+0

問題を自分で解決した場合は、問題の内容と解決方法を説明した回答を投稿し、その回答に合格とマークしてください。 –

答えて

0

次のコードは、推奨されているように変更した後に問題なく動作します。

class GetSocket 
{  
    public string SocketSendReceive(string server, int port, string cmd) 
    { 
     byte[] recvBuffer = new byte[1024]; 
     TcpClient tcpClient = new TcpClient(); 
     tcpClient.Client.ReceiveTimeout = 200; 
     string tmp; 


      try 
      { 
       tcpClient.Connect(server, 6100); 

      } 
      catch (SocketException e) 
      { 

       MessageBox.Show(e.Message); 

      } 



      if (tcpClient != null && tcpClient.Connected) 
      { 
       try 
       { 
        tcpClient.Client.Send(Encoding.UTF8.GetBytes(cmd)); 
        tcpClient.Client.Receive(recvBuffer); 
        tmp = Encoding.ASCII.GetString(recvBuffer, 0, recvBuffer.Length); 
        string[] words = tmp.Split(null); 
        return words[1]; 

       } 

       catch (SocketException e) 
       { 
        return ("No Answer Received"); 
       } 

      } 
     return null; 
    } 


} 
関連する問題