1. ホーム
  2. c#

[解決済み] TcpClientのタイムアウトを設定するには?

2023-05-11 20:06:55

質問

リモートコンピュータ上のリスナーにデータを送信するために使用する TcpClient があります。リモート コンピューターは、あるときはオンで、あるときはオフになっています。このため、TcpClient は、しばしば接続に失敗します。私は、TcpClientを1秒後にタイムアウトさせ、リモート・コンピュータに接続できないときに時間をかけないようにしたいのです。現在、私はこのコードをTcpClientに使用しています。

try
{
    TcpClient client = new TcpClient("remotehost", this.Port);
    client.SendTimeout = 1000;

    Byte[] data = System.Text.Encoding.Unicode.GetBytes(this.Message);
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[512];
    Int32 bytes = stream.Read(data, 0, data.Length);
    this.Response = System.Text.Encoding.Unicode.GetString(data, 0, bytes);

    stream.Close();
    client.Close();    

    FireSentEvent();  //Notifies of success
}
catch (Exception ex)
{
    FireFailedEvent(ex); //Notifies of failure
}

これはタスクを処理するのに十分な働きをします。可能であれば送信し、リモートコンピュータに接続できない場合は例外を捕捉します。しかし、接続できない場合、例外をスローするのに10秒から15秒かかります。1秒程度でタイムアウトするようにしたいのですが?どのようにタイムアウト時間を変更すればよいのでしょうか?

どのように解決するのですか?

あなたは、非同期 BeginConnect のメソッドを使用する必要があります。 TcpClient のメソッドを呼び出すことで、コンストラクタが行うような同期接続を試みるのではありません。このようなものです。

var client = new TcpClient();
var result = client.BeginConnect("remotehost", this.Port, null, null);

var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));

if (!success)
{
    throw new Exception("Failed to connect.");
}

// we have connected
client.EndConnect(result);