Python3.2.3:Socket超时的时间比它应该的长?

2024-09-29 23:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows7上使用的是Python3.2.3,其中一段代码通过一个阻塞套接字连接到一个服务器,并使用用户指定的超时值。代码很简单:

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

代码运行得很好,除了一个奇怪的事实,超时似乎比它在无效请求上应该花费的时间长。我试着连接到www.google.com:59855故意(随机端口应该意味着它应该尝试连接,直到到达超时),超时为5秒,但似乎至少需要15秒才能超时。在

是否有任何可能的原因,和/或任何补救措施?(如果它不可修复,这不是一个大问题,但是如果能找到一个解决方案,我们将不胜感激。)提前谢谢。在


Tags: 代码用户服务器hostportcreatetimeoutsocket
1条回答
网友
1楼 · 发布于 2024-09-29 23:25:05

这不是python3或Windows特有的问题。查看create_connection()的文档:http://docs.python.org/library/socket.html#socket.create_connection

重要的片段是:

if host is a non-numeric hostname, it will try to resolve it for both AF_INET and AF_INET6, and then try to connect to all possible addresses in turn until a connection succeeds.

它使用套接字.getaddrinfo. 如果你跑了

socket.getaddrinfo('google.com', 59855, 0, socket.SOCK_STREAM)

你可能会得到一些返回的结果。当你打电话的时候socket.create_连接,它将迭代所有这些结果,每个结果都等待超时秒,直到失败。因为它等待每个结果的超时秒数,所以总时间显然要大于超时时间。在

如果使用IP地址而不是主机名调用create_connection,例如

^{pr2}$

你应该得到5秒的暂停时间。在

如果你真的很好奇,可以看看create_connection的源代码。它非常简单,您可以看到导致您的问题的循环: https://github.com/python/cpython/blob/3.2/Lib/socket.py#L408

相关问题 更多 >

    热门问题