如何在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)