我需要在python的socket recv方法上设置超时。该怎么做呢?
发布于 2010-04-27 21:49:30
典型的方法是使用select()等待,直到数据可用或超时。只有在数据实际可用时才调用recv()
。为了安全起见,我们还将套接字设置为非阻塞模式,以保证recv()
永远不会无限期地阻塞。select()
还可用于同时等待多个套接字。
import select
mysocket.setblocking(0)
ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
data = mysocket.recv(4096)
如果您有很多打开的文件描述符,那么poll()是比select()
更有效的替代方案。
另一种选择是使用socket.settimeout()
为套接字上的所有操作设置超时,但我看到您在另一个答案中明确拒绝了该解决方案。
发布于 2010-04-27 13:56:31
发布于 2014-08-28 01:15:52
如前所述,select.select()
和socket.settimeout()
都可以工作。
注您可能需要调用settimeout
两次,例如
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("",0))
sock.listen(1)
# accept can throw socket.timeout
sock.settimeout(5.0)
conn, addr = sock.accept()
# recv can throw socket.timeout
conn.settimeout(5.0)
conn.recv(1024)
https://stackoverflow.com/questions/2719017
复制相似问题