我在Windows 7上使用Python 3.2.3,并且我已经连接到具有阻塞套接字的服务器的一段代码,具有用户指定的超时值。代码很简单:
testconn = socket.create_connection((host, port), timeout)
代码工作正常,除了奇怪的事实,超时似乎需要比无效请求更长的时间。我试图故意连接到www.google.com:59855(随机端口应该意味着它应该尝试连接,直到达到超时),超时为5秒,但似乎至少需要15秒才能超时。
是否有任何可能的原因和/或任何修复? (如果它不可修复,这不是一个大问题,但不过可以理解一个解决方案。)在此先感谢。
答案 0 :(得分:7)
这不是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)
你可能会得到一些结果。当你调用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