如何在python的socket recv方法上设置超时?

2024-04-25 12:02:46 发布

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


Tags: python
3条回答

典型的方法是使用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()为套接字上的所有操作设置超时,但我看到您在另一个答案中明确拒绝了该解决方案。

^{}

如前所述,^{}^{}都可以工作。

注意,您可能需要根据需要调用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)

相关问题 更多 >