Arc*_*des 1 python sockets windows networking
我在Windows 7上使用Python 3.2.3,并且我已经连接到具有阻塞套接字的服务器的一段代码,具有用户指定的超时值.代码很简单:
testconn = socket.create_connection((host, port), timeout)
Run Code Online (Sandbox Code Playgroud)
代码工作正常,除了奇怪的事实,超时似乎需要比无效请求更长的时间.我试图故意连接到www.google.com:59855(随机端口应该意味着它应该尝试连接,直到达到超时),超时为5秒,但似乎至少需要15秒才能超时.
是否有任何可能的原因和/或任何修复?(如果它不可修复,这不是一个大问题,但不过可以理解解决方案.)在此先感谢.
这不是Python 3或Windows特有的问题.看一下create_connection()的文档:http://docs.python.org/library/socket.html#socket.create_connection
重要的片段是:
如果host是非数字主机名,它将尝试为AF_INET和AF_INET6解析它,然后尝试依次连接到所有可能的地址,直到连接成功.
它使用socket.getaddrinfo解析名称.如果你跑
socket.getaddrinfo('google.com', 59855, 0, socket.SOCK_STREAM)
Run Code Online (Sandbox Code Playgroud)
你可能会得到一些结果.当你调用socket.create_connection时,它将迭代所有这些结果,每个结果都等待超时秒,直到它失败.因为它等待每个结果的超时秒数,所以总时间显然会大于超时.
如果使用IP地址而不是主机名调用create_connection,例如
testconn = socket.create_connection(('74.125.226.201', 59855), timeout=5)
Run Code Online (Sandbox Code Playgroud)
你应该得到你的5秒超时.
如果你真的很好奇,请看一下create_connection的来源.它非常简单,您可以看到导致问题的循环:https: //github.com/python/cpython/blob/3.2/Lib/socket.py#L408