簡體   English   中英

讀取由select()發出信號,但recv()在無阻塞套接字上不返回任何數據和信號EAGAIN

[英]Read signaled by select(), but recv() returns no data and signal EAGAIN on non-blocking sockets

我已經收到要從select()讀取的信號套接字,但是recv call()沒有到達任何數據,相反它以errno == EAGAIN返回-1。

我可以保證沒有其他線程觸及套接字。

我認為這種行為是不正確的。 如果從另一端發生了隨后的關閉,我可以期望返回值0(正常關閉)或來自recv的其他錯誤代碼,而不是EAGAIN,因為我認為這意味着將來會有數據到達。

我發現這個問題以前的一些線程在這里 ,但沒有解決方案。

在Ubuntu Linux Oneric或其他最新的Linux發行版上,我會發生這種情況,然后從鏈接信息中發布此信息

對於3.0.0內核或最新的2.6.x,將其固定在內核中並不正確

是否有人知道為什么會發生以及如何避免這種不良行為?

將套接字報告為可讀的Select()並不意味着要讀取某些內容。 這意味着讀取不會阻塞。 讀取可能返回-1或0, 但不會阻塞

更新:

select返回可讀后:如果read()返回-1,則檢查errno。 EAGAIN / EWOULDBLOCK和EINTR是要特別處理的值:主要是通過重新發出read()來實現,但是您可能會信任select循環在下一次返回可讀狀態。

如果涉及多個線程,事情可能會變得更加困難。

我遇到了同樣的問題,但使用epoll。 我注意到,只要系統重新使用已經關閉的套接字的FD號,就會發生這種情況。 經過一些研究,我注意到這種現象是由於在對套接字進行輪詢時關閉套接字而引起的。 嘗試避免在關閉套接字時在套接字上運行select-這可能會有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM