Python 3.2.3:Socket需要更长的时间来超时吗?

时间:2012-09-01 23:23:13

标签: python windows sockets networking

我在Windows 7上使用Python 3.2.3,并且我已经连接到具有阻塞套接字的服务器的一段代码,具有用户指定的超时值。代码很简单:

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

代码工作正常,除了奇怪的事实,超时似乎需要比无效请求更长的时间。我试图故意连接到www.google.com:59855(随机端口应该意味着它应该尝试连接,直到达到超时),超时为5秒,但似乎至少需要15秒才能超时。

是否有任何可能的原因和/或任何修复? (如果它不可修复,这不是一个大问题,但不过可以理解一个解决方案。)在此先感谢。

1 个答案:

答案 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