我在Windows 7上使用Python 3.2.3,并且我用一个阻塞的套接字连接到一个服务器,并且有一个用户指定的超时值。 代码很简单:
testconn = socket.create_connection((host, port), timeout)
代码工作正常,除了奇怪的事实,超时似乎花费比无效请求更长的时间。 我试图故意连接到www.google.com:59855(随机端口应该意味着它应该尝试连接,直到超时),超时5秒,但似乎至less需要15秒超时。
是否有任何可能的原因,和/或任何修复? (这不是一个巨大的问题,如果它不是可以解决的,但一个解决scheme将不胜感激。)在此先感谢。
这不是Python 3或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的来源。 这很简单,你可以看到导致你的问题的循环: http : //hg.python.org/releasing/3.2.3/file/86d1421a552c/Lib/socket.py