2011-01-03 27 views
13

次のコードでTCP接続をテストしようとしています。テストTCP接続タイムアウトを設定するにはどうすればよいですか?

System.Threading.Thread t = new System.Threading.Thread(() => 
{  
    using (TcpClient client = new TcpClient()) 
    { 
     client.Connect(ip, Convert.ToInt32(port)); 
    } 
}); 
t.Start(); 

IPまたはポートが無効な場合にタイムアウトを設定するにはどうすればよいですか?

+5

[それを行うには良い方法がないように思える。](http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/2281199d-cd28-4b5c-95dc -5a888a6da30d /) –

+0

これはできません。タイムアウトは送信操作に対してのみ調整できます。独自のタイムアウトメカニズムを実装することは不可能ですが、より長いタイムアウト値を達成することはできません。 – Mervin

答えて

15

これを行う方法はありません。私は多くのアプリケーションで次のコードを使用しています。コードは決してオリジナルではありませんが、大丈夫です。この関数にリトライを追加する必要があるかもしれないことに注意してください。サーバが起動していてもfalseを返すことがあります。 OPにまだ検索からこのページを見つける誰が使用するもの

private static bool _TryPing(string strIpAddress, int intPort, int nTimeoutMsec) 
    { 
     Socket socket = null; 
     try 
     { 
      socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false); 


      IAsyncResult result = socket.BeginConnect(strIpAddress, intPort, null, null); 
      bool success = result.AsyncWaitHandle.WaitOne(nTimeoutMsec, true); 

      return socket.Connected; 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (null != socket) 
       socket.Close(); 
     } 
    } 
+0

こんにちは、私はコードの2つの質問があります:1.どのような未使用の変数の成功使用する予定ですか? 2.あなたのコード例を試してみたら、socket.Close()の直後にObjectDisposedExceptionが発生します。それは何でしょうか? – Offler

+0

変数の成功は役に立たない...私はちょうど例として働いていたコードの部分を取った。ここでの一般的な考え方は、非同期接続を開始し、接続が成功するかタイムアウトするまで待つことです。次に、ソケットの接続状態を確認します。 – Saibal

10

これを達成する直接的な方法はありませんが、それを行う方法の1つは、接続をテストする別個の方法を持つことです。この方法は、接続が確立し得るように、指定された時間だけ待って、それが時間内に接続されます場合は、それは接続を閉じますし、それ以外の、trueを返しWaitHandleを使用することになり

static bool TestConnection(string ipAddress, int Port, TimeSpan waitTimeSpan) 
     { 
      using (TcpClient tcpClient = new TcpClient()) 
      { 
       IAsyncResult result = tcpClient.BeginConnect(ipAddress, Port, null, null); 
       WaitHandle timeoutHandler = result.AsyncWaitHandle; 
       try 
       { 
        if (!result.AsyncWaitHandle.WaitOne(waitTimeSpan, false)) 
        { 
         tcpClient.Close(); 
         return false; 
        } 

        tcpClient.EndConnect(result); 
       } 
       catch (Exception ex) 
       { 
        return false; 
       } 
       finally 
       { 
        timeoutHandler.Close(); 
       } 
       return true; 
      } 
     } 

、それはタイムアウトと戻ります偽です。

+0

接続エラーが発生する可能性があるため、この方法は実際にはあまり役に立ちません。 http://social.msdn.microsoft.com/Forums/en-US/313cf28c-2a6d-498e-8188-7a0639dbd552/tcpclientbeginconnect-issue –

8

多く手遅れには、.NET 4.5で導入された非同期プログラミング機能を使用してこの問題を解決することができます。

var hostname = "127.0.0.1"; 
var port = 123; 
var timeout = TimeSpan.FromSeconds(3); 
var client = new TcpClient(); 
if (!client.ConnectAsync(hostname, port).Wait(timeout)) 
{ 
    // timed out 
} 
+0

これは動作しますが、Waitメソッドはスレッドをロックします。 – ozziwald

関連する問題