2012-09-01 53 views
1

我在Windows 7上使用Python 3.2.3,并且我有一段代码通过阻塞套接字连接到服务器,并带有用户指定的超时值。代码很简单:Python 3.2.3:套接字需要更长时间才能超时?

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

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

是否有任何可能的原因和/或任何修复? (如果它不是可解决的,这不是一个大问题,但是不管怎样解决方案都是可以的。)提前致谢。

+0

如果你指定一个超时,套接字不再处于阻塞模式。请参阅插座模块文档。 –

+0

你误解了一件事。如果它得到'连接被拒绝',它将立即失败,根本没有任何重试。重试是针对没有收到答复的情况。 – EJP

+0

@RolandSmith我无法在文档中的任何地方看到它所说的内容,反正它也没有意义。非阻塞连接将立即返回,而不是超时。 – EJP

回答

6

这不是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

相关问题