gpt4 book ai didi

python 3.2.3 : Socket takes longer to timeout than it should?

转载 作者:可可西里 更新时间:2023-11-01 10:59:11 24 4
gpt4 key购买 nike

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

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

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

是否有任何可能的原因和/或任何修复? (如果它无法修复,这不是一个大问题,但无论如何,我们将不胜感激。)提前致谢。

最佳答案

这不是 Python 3 或 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.

它使用 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

关于 python 3.2.3 : Socket takes longer to timeout than it should?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12232225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com