怎么可能recv的epoll的时候已经暗示活性()调用块?(How could a recv() c

2019-09-28 10:43发布

我的应用程序的libevent状,使用epoll的 (在电平触发模式)来检测I / O活动并调用回调函数来处理它。

我最近发现我的TCP / IP套接字是阻塞,这是一个意外,但我仍然不会想到recv()调用在FD阻止其报道epoll具有读取待执行的活动。 即使在插座上有错误,肯定recv()将返回,并告诉我这件事。

什么是我误解这件事吗?
可能会导致什么样的网络条件recv()在这种情况下阻止?

Answer 1:

从Linux 选择手册页:

在Linux下,选择()可能会报告套接字文件描述符为“读就绪”,同时仍然随后的读取块。 例如,这可以发生时的数据已经到达,但经检查有错误校验和被丢弃。 有可能是其中一个文件描述符虚假报道为准备的其他情形。 因此,它可能会更安全的,不应该阻止套接字使用O_NONBLOCK。

(是的,我知道的epoll()是不一样的选择(),但我怀疑相同的基础条件适用于)

我认为,如果你真的想避免阻塞,来实现这一目标的唯一安全的方法是你的插槽设置为非阻塞模式。



Answer 2:

如果您使用的是Epoll轮询EPOLLIN事件,再经过一个recv调用应立即返回。 此外,我希望你利用无阻塞插座。 如果你要寻找的错误,那么你可以看看EPOLLERR事件。 如果插座被epoll的信号后关闭,那么recv的应该失败。 您epoll_wait,epoll_ctl和套接字创建的代码片段将在调试问题有帮助。



文章来源: How could a recv() call block when epoll has signalled activity?