首页 文章

给定任何epoll TCP套接字事件,如果EPOLLRDHUP = 0且EPOLLIN = 1;是对read()/ recv()的后续调用,保证返回不等于0的读取大小?

提问于
浏览
6

从epoll_ctl的手册:

EPOLLRDHUP(自Linux 2.6.17开始)流套接字对等关闭连接,或关闭写入一半的连接 . (此标志对于编写简单代码以在使用边缘触发监视时检测对等关闭特别有用 . )

从recv手册:

如果没有可以接收的消息且对等体已经执行了有序关闭,则recv()将返回0 .

在我看来,上面的两个都涵盖了相同的场景,并且只要我首先捕获EPOLLRDHUP事件,我就永远不会收到长度为0的read()或recv()(因此不需要打扰检查这样的) . 但这是否保证是真的?

1 回答

  • 7

    如果您收到 EPOLLRDHUP=1 的活动,则只需立即关闭连接而不阅读 . 如果你得到 EPOLLRDHUP=0EPOLLIN=1 的事件然后继续阅读,但你应该准备好处理 recv() 仍然返回0的可能性,以防万一 . 也许 FIN 在你得到 EPOLLIN=1 之后到达,但在你真正打电话给 recv() 之前 .

相关问题