我需要在python的套接字recv方法上設置超時。怎麼做?如何在python的套接字recv方法上設置超時?
回答
它不超時的的recv(至少在我嘗試了)。只有accept()超時。 – 2011-06-01 11:40:16
在完全按照預期設置socket.settimeout()後,socket.recv()似乎超時了。我在做這個嗎?其他人能證實這一點嗎? – Aeonaut 2011-10-23 03:20:49
@Aeonaut我認爲這段時間大部分時間都是recv(),但是有一個競爭條件。在socket.recv()中,Python(2.6)使用超時在內部調用select/poll,然後立即調用recv()。所以如果你使用阻塞套接字,並且在這兩個調用之間另一個端點崩潰,你可能會無限期地掛在recv()上。如果你使用非阻塞套接字,python不會在內部調用select.select,所以我認爲Daniel Stutzbach的答案是正確的。 – 2012-08-04 08:51:31
典型的方法是使用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()
插座上的所有操作,但我看到你已經明確拒絕了另一個答案是解決方案。
如前所述既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)
我認爲,無論你如何捅捅這個功能,他都會遇到同樣的事情。我已經嘗試了2或4個超時,現在仍然掛起。 settimeout也會掛起。 – 2014-09-30 22:19:28
當你多次調用'.settimeout()'時,你可以首先調用'setdefaulttimeout()'方法。 – mvarge 2016-11-17 21:40:43
你可以接收到響應之前,並在收到響應後設置超時設置回無:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5.0)
data = sock.recv(1024)
sock.settimeout(None)
試試這個,它使用的基本C.
timeval = struct.pack('ll', 2, 100)
s.setsockopt(socket.SOL_SOCKET,SO_RCVTIMEO, timeval)
- 1. 套接字recv的設置超時TCP
- 2. recv上的可讀套接字超時
- 3. 在recv方法python TCP套接字塊
- 4. 設置UDP套接字的recv fcn的超時時間
- 5. 如何設置zmq套接字超時
- 6. 如何在客戶端套接字連接上設置超時?
- 7. 如何閱讀Python套接字recv
- 8. 在python中設置全局套接字超時的正確方法是什麼?
- 9. recv()windows套接字需要無限時間 - 如何超時?
- 10. Python套接字recv()問題
- 11. 套接字接收設置超時
- 12. 是否可以在Twisted上的套接字上設置超時?
- 13. 如何在訪問套接字時將fread設置爲超時?
- 14. 如何在查找主機時設置套接字超時?
- 15. 在套接字上設置超時時出現NoSuchElementException
- 16. 如何在C套接字上設置「connect()」函數的超時時間?
- 17. UDP套接字設置超時
- 18. 設置PrimeFaces套接字超時
- 19. 如何在Ruby中設置套接字超時?
- 20. 如何設置套接字超時失敗連接
- 21. 多線程中的python套接字recv
- 22. 在netty通道上設置套接字超時
- 23. 爲什麼要在套接字的'recv'方法上設置一個保守的最大字節大小?
- 24. Python套接字測試recv()數據
- 25. python套接字recv()和信號
- 26. .NET套接字超時 - 在關閉方法上阻塞
- 27. Python TCP套接字recv(1)與recv(n)的效率
- 28. 設置超時設置的套接字有時會在閱讀時失速
- 29. 如何設置一個pyzmq套接字隊列超時
- 30. Python套接字連接超時
如果FYI你確實選擇使用超時...你需要知道如何處理超時。這太問題有關處理談判時發生超時:https://stackoverflow.com/questions/16745409 – 2017-11-21 16:25:17