private void button_Click(object sender, EventArgs e)
{
TcpClient client = new TcpClient
{
ReceiveTimeout = 1000,
SendTimeout = 1000
};
try
{
client.Connect(host, port);
client.Close();
}
catch
{
client.Close();
}
}
タイムアウト設定を1000ミリ秒に設定しているのですが適用されなくて(21秒後に自動的にタイムアウト)困っています。
繋がるところや最初から拒否されているところはすぐ反映されるので接続方法に関しては問題ないかと思っています。
どこがいけないんでしょうか。
TcpClient クラス (System.Net.Sockets)
ReceiveTimeout 読み取り操作が開始された後に TcpClient がデータの受信を待機する時間を取得または設定します。 SendTimeout 送信操作が正常に完了するのを TcpClient が待機する時間を取得または設定します。
どちらも、connect した後に読み書きするときのタイムアウトの指定です。
connect できるかどうかのタイムアウトの指定ではないので、期待通りの動作をしません。
unix の socket は、select システムコールを使って connect のタイムアウトを設定しますが、Windows (WIN32API) の socket は WSAWaitForMultipleEvents API で待ち合わせるように作ります。
.NET といえども、Windows API のラッパーなので、イベントを待ち合わせるというふうに作るようです。
http://stackoverflow.com/questions/17118632/how-to-set-the-timeout-for-a-tcpclient
http://noterr0001.hateblo.jp/entry/20100201/1265007068
TcpClient.BeginConnect で、接続処理(+callback)を非同期で実行しておいて、別途、待ち合わせをしておいて、一定時間内に終わっていなければエラーにする、という考え方だと思います。