如何在python的套接字recv方法上设置超时?
我需要在python的套接字recv方法上设置超时。 怎么做?
典型的方法是使用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()
一个更有效的select()
。
另一个select是使用socket.settimeout()
为套接字上的所有操作设置超时,但是我发现在另一个答案中明确拒绝了该解决scheme。
有socket.settimeout()
如前所述, select.select()
和socket.settimeout()
都可以工作。
请注意,您可能需要根据需要调用settimeout
两次,例如
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 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)
您可以在收到响应之前设置超时,并在收到响应后将其设回无:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5.0) data = sock.recv(1024) sock.settimeout(None)
第一个答案是好的,尽pipe事实上,select和非阻塞IO是互斥的 ,所以你应该设置你的套接字非阻塞模式,并处理超时外部或使用select,但不是两个。
试试这个使用底层的C.
timeval = struct.pack('ll', 2, 100) s.setsockopt(socket.SOL_SOCKET,SO_RCVTIMEO, timeval)