0

次のコードを取得しました。

TcpClient client = new TcpClient("server", 5555);

サーバーはすぐに ICMP port-unreachable を返しますが、プログラムは 10054 エラーでタイムアウトするまで約 30 秒かかります。

ファイアウォールをオフにし、wireshark もパケットをキャプチャしているため、Windows 構成の問題ではありません。

TcpClient にポート到達不能パケットを認識させるにはどうすればよいですか?

4

1 に答える 1

0

開いているポートはすぐに TcpClient によってすぐに処理される ICMP パケットを返しますが、閉じられた/ブロックされたポートの "Port Unreachable" 応答では、TcpClient は 30 秒のタイムアウトまで待機する必要があります。以下のように非同期呼び出しを行うことで、タイムアウト方法を変更できます。

TcpClient client = new TcpClient();
client.BeginConnect("server", 5555, new AsyncCallback(CallBack), client);

private void CallBack(IAsyncResult result)
{
 bool connected = false;
 using (TcpClient client = (TcpClient)result.AsyncState)
 {
    try
    {
        client.EndConnect(result);
        connected = client.Connected;
    }
    catch (SocketException)
    {
    }
 }
 if (connected)
 {
    this.Invoke((MethodInvoker)delegate
    {
        // Do Something
    });
 }
 else
 {
    this.Invoke((MethodInvoker)delegate
    {
        // Do Something
    });
 } 
}
于 2012-06-24T01:24:24.773 に答える