1

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

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

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

是否有任何可能的原因,和/或任何修复?(如果它无法修复,这不是一个大问题,但仍然会感谢您的解决方案。)提前致谢。

4

1 回答 1

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 时,它将遍历所有这些结果,每个结果都会等待 timeout 秒,直到它失败。因为它为每个结果等待 timeout 秒,所以总时间显然会大于 timeout。

如果您使用 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 回答