当epoll发出活动信号时,recv()调用如何阻止?

时间:2017-01-16 15:34:48

标签: c++ linux networking tcp-ip epoll

我的应用程序类似于libevent,使用 epoll (在级别触发模式下)来检测I / O活动并调用回调来处理它。

我最近发现我的TCP / IP套接字是阻塞的,这是一个意外,但我仍然不希望recv()调用阻止{{1}报告的FD有阅读活动待定。即使套接字上有错误,肯定会epoll返回并告诉我它。

我对此有何误解?
在这种情况下,哪种网络状况会导致recv()阻塞?

2 个答案:

答案 0 :(得分:2)

来自Linux select手册页:

  

在Linux下,select()可以将套接字文件描述符报告为“就绪”   用于阅读“,然而是随后的读取块。这   例如,当数据到达但是经过检查时就会发生   有错误的校验和,并被丢弃。可能还有其他的   虚假报告文件描述符的情况   准备。因此,在应该使用的套接字上使用O_NONBLOCK可能更安全   不阻止。

(是的,我知道epoll()与select()不同,但我怀疑相同的基本条件适用于两者)

我认为如果您真的想避免阻止,唯一可以安全的方法是将套接字设置为非阻塞模式。

答案 1 :(得分:0)

如果您使用Epoll轮询EPOLLIN事件,那么之后的recv调用应立即返回。此外,我希望你使用非阻塞套接字。如果您想查找错误,那么您可以查找EPOLLERR事件。如果套接字在epoll信号后关闭,则recv应该失败。 epoll_wait,epoll_ctl和socket创建的代码片段将有助于调试问题。

相关问题