Python套接字连接超时。

82

我有一个套接字,我希望在连接时设置超时时间,以便在无法连接时取消整个操作,但我也希望使用套接字的makefile功能,而这需要无超时限制。

是否有简单的方法来实现这一点,还是说这将是一个困难的事情?

Python是否允许在连接后重置超时时间,以便我可以同时使用makefile并仍然具有套接字连接的超时限制?


是的,Python允许超时重置。您甚至可以在makefile之后设置不同的超时时间。我已经在Linux和Windows上进行了测试。 - NameOfTheRose
4个回答

146

在尝试连接之前,您只需要使用套接字的 settimeout() 方法,但请注意,在连接后,您必须使用 settimeout(None) 将套接字设置为阻塞模式,这是 makefile 所需要的。

这是我正在使用的代码:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect(address)
sock.settimeout(None)
fileobj = sock.makefile('rb', 0)

42
有关信息,超时必须用秒表示。 - laurent

28

如果您使用的是Python2.6或更高版本,则可以方便地使用socket.create_connection

sock = socket.create_connection(address, timeout=10)
sock.settimeout(None)
fileobj = sock.makefile('rb', 0)

4

设置Socket超时时间,需要按照以下步骤进行:

import socket
socks = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socks.settimeout(10.0) # settimeout is the attr of socks.

2
这样做不对吧? 应该是 socks.settimeout(10.0) 否则你会遇到一个属性错误。 - Aiyion.Prime
3
请注意,在版本3.7.x及之前,还有一个sockets.setdefaulttimeout(10.0),我认为它被所有新创建的套接字库对象使用,以设置超时。 - DevPlayer
1
补充@DevPlayer的说明,你需要在创建套接字之前调用sockets.setdefaulttimeout(10.0)。已在Python 3.10.6中进行了测试。 - Michael

1

Try this code:

try:
   import socket  
   socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   socket.settimeout(10)
except socket.error:
    print("Nope !!!")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接