1

私は Windows 7 で Python 3.2.3 を使用しています。私が持っている 1 つのコードは、ユーザー指定のタイムアウト値で、ブロッキング ソケットを使用してサーバーに接続します。コードは次のとおりです。

testconn = socket.create_connection((host, port), timeout)

コードは正常に動作しますが、無効な要求ではタイムアウトに時間がかかるように見えるという奇妙な事実は別として. 意図的にwww.google.com:59855に接続してみました(ランダムポートは、タイムアウトに達するまで接続を試行する必要があることを意味するはずです)。タイムアウトは5秒ですが、タイムアウトには少なくとも15秒かかるようです。

これには考えられる理由や修正方法はありますか? (修正できなくても大きな問題ではありませんが、それでも解決策をいただければ幸いです。) よろしくお願いします。

4

1 に答える 1

7

これは、Python3またはWindowsに固有の問題ではありません。create_connection()のドキュメントをご覧ください:http://docs.python.org/library/socket.html#socket.create_connection

重要なスニペットは次のとおりです。

ホストが数値以外のホスト名の場合、AF_INETとAF_INET6の両方でホストを解決しようとし、接続が成功するまで、考えられるすべてのアドレスに順番に接続しようとします。

socket.getaddrinfoを使用して名前を解決します。実行した場合

socket.getaddrinfo('google.com', 59855, 0, socket.SOCK_STREAM)

おそらくいくつかの結果が返されます。socket.create_connectionを呼び出すと、これらすべての結果が繰り返され、失敗するまでタイムアウト秒が待機します。各結果をタイムアウト秒待機するため、合計時間は明らかにタイムアウトより長くなります。

ホスト名ではなくIPアドレスを使用してcreate_connectionを呼び出す場合、たとえば

testconn = socket.create_connection(('74.125.226.201', 59855), timeout=5)

5秒のタイムアウトを取得する必要があります。

また、本当に興味がある場合は、create_connectionのソースを確認してください。それは非常に単純で、問題を引き起こしているループを見ることができます: https ://github.com/python/cpython/blob/3.2/Lib/socket.py#L408

于 2012-09-02T00:36:50.847 に答える