人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: ponpontako
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

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


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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ