2024-04-25 12:02:46 发布
网友
典型的方法是使用select()等待数据可用或等待超时。只有在数据实际可用时才调用recv()。为了安全起见,我们还将套接字设置为非阻塞模式,以确保recv()永远不会无限期阻塞。select()也可用于一次等待多个套接字。
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()为套接字上的所有操作设置超时,但我看到您在另一个答案中明确拒绝了该解决方案。
socket.settimeout()
有^{}
如前所述,^{}和^{}都可以工作。
注意,您可能需要根据需要调用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)
典型的方法是使用select()等待数据可用或等待超时。只有在数据实际可用时才调用
recv()
。为了安全起见,我们还将套接字设置为非阻塞模式,以确保recv()
永远不会无限期阻塞。select()
也可用于一次等待多个套接字。如果有很多打开的文件描述符,poll()是
select()
的更有效的替代方法。另一个选项是使用
socket.settimeout()
为套接字上的所有操作设置超时,但我看到您在另一个答案中明确拒绝了该解决方案。有^{}
如前所述,^{} 和^{} 都可以工作。
注意,您可能需要根据需要调用
settimeout
两次,例如相关问题 更多 >
编程相关推荐