繁体   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