C#のTimeoutについての質問です。


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秒後に自動的にタイムアウト)困っています。
繋がるところや最初から拒否されているところはすぐ反映されるので接続方法に関しては問題ないかと思っています。
どこがいけないんでしょうか。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2014/12/03 18:43:11
  • 終了:2014/12/04 20:40:37

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4442ベストアンサー獲得回数18252014/12/03 22:42:03

ReceiveTimeout読み取り操作が開始された後に TcpClient がデータの受信を待機する時間を取得または設定します。
SendTimeout送信操作が正常に完了するのを TcpClient が待機する時間を取得または設定します。
TcpClient クラス (System.Net.Sockets)

どちらも、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)を非同期で実行しておいて、別途、待ち合わせをしておいて、一定時間内に終わっていなければエラーにする、という考え方だと思います。

id:ponpontako

connect後の処理だったんですね、ずっと勘違いしていました。
詳しく書いてあるサイトも紹介していただきありがとうございます。
理想通りの動きをしてくれるようになりました。

2014/12/04 20:40:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません