9

少し検索しましたが、探している答えが見つからないようです.selectを使用してソケットがタイムアウトしたかどうかを確認することだけが見つかりました.これは私がすでに行っていることです.

私が知りたいのは、タイムアウトするまでの時間を変更する方法はありますconnect()か? 私は現在、 which を使用してset をselect()返し、最終的にを返します。とにかく、これが発生するまでにかかる時間を変更できますか? 現在、約 60 秒後に発生します。呼び出しに渡すタイムアウト値を調整しようとしましたが、これはタイムアウトになるまでの時間にのみ影響します。errnoEINPROGRESSETIMEDOUTETIMEDOUTselect()select()

4

2 に答える 2

4
  1. ソケットを作成します。
  2. ノンブロッキングモードにします。
  3. 問題connect()
  4. select()またはpoll()またはを呼び出しepoll()て、希望するタイムアウトを指定し、ソケットを として指定しますwritefd。つまり、タイムアウトが期限切れになるか、ソケットが書き込み可能になるまでブロックします。
  5. タイムアウトになった場合は、ソケットなどを閉じます。
  6. それ以外の場合は、ソケット経由で最後のエラーを取得し、getsockopt()それがゼロかどうかを確認します。そうであれば、接続は成功しています。そうでなければ、接続は失敗しています。

この方法では、プラットフォームのデフォルト (約 1 分) を超えて接続タイムアウトを増やすことはできませんが、減らすことはできます。

于 2013-06-17T10:39:50.383 に答える
1

setsockopt(3) を使用すると、これを設定できます: http://linux.die.net/man/3/setsockopt

少し紛らわしいですが、タイムアウト値は実際にはソケットのプロパティです。

探しているオプションは次のとおりです: SO_SNDTIMEO および SO_RCVTIMEO

編集 コメントで述べたように、これは接続では機能しません。理由は次のとおりです 。 http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout 解決策として、最初のハンドシェイクが失敗した後に接続を確立するためにカーネルが送信する再試行 SYN パケットの量に制限を設定することをお勧めします。前回の再試行から時間は 2 倍になります。つまり、a) 再試行の回数しか設定できず、これが間接的に接続タイムアウト値に加算されます。b) これは OS 固有でシステム全体です。おそらくあなたのための解決策ではありません....

于 2013-06-17T09:41:44.687 に答える