我的应用程序的libevent状,使用epoll的 (在电平触发模式)来检测I / O活动并调用回调函数来处理它。
我最近发现我的TCP / IP套接字是阻塞,这是一个意外,但我仍然不会想到recv()
调用在FD阻止其报道epoll
具有读取待执行的活动。 即使在插座上有错误,肯定recv()
将返回,并告诉我这件事。
什么是我误解这件事吗?
可能会导致什么样的网络条件recv()
在这种情况下阻止?
我的应用程序的libevent状,使用epoll的 (在电平触发模式)来检测I / O活动并调用回调函数来处理它。
我最近发现我的TCP / IP套接字是阻塞,这是一个意外,但我仍然不会想到recv()
调用在FD阻止其报道epoll
具有读取待执行的活动。 即使在插座上有错误,肯定recv()
将返回,并告诉我这件事。
什么是我误解这件事吗?
可能会导致什么样的网络条件recv()
在这种情况下阻止?
从Linux 选择手册页:
在Linux下,选择()可能会报告套接字文件描述符为“读就绪”,同时仍然随后的读取块。 例如,这可以发生时的数据已经到达,但经检查有错误校验和被丢弃。 有可能是其中一个文件描述符虚假报道为准备的其他情形。 因此,它可能会更安全的,不应该阻止套接字使用O_NONBLOCK。
(是的,我知道的epoll()是不一样的选择(),但我怀疑相同的基础条件适用于)
我认为,如果你真的想避免阻塞,来实现这一目标的唯一安全的方法是你的插槽设置为非阻塞模式。
如果您使用的是Epoll轮询EPOLLIN事件,再经过一个recv调用应立即返回。 此外,我希望你利用无阻塞插座。 如果你要寻找的错误,那么你可以看看EPOLLERR事件。 如果插座被epoll的信号后关闭,那么recv的应该失败。 您epoll_wait,epoll_ctl和套接字创建的代码片段将在调试问题有帮助。