7

从 epoll_ctl 的手册中:

EPOLLRDHUP(自 Linux 2.6.17 起)

Stream socket peer 关闭连接,或者关闭写入一半的连接。(此标志对于编写简单代码以在使用边缘触发监视时检测对等关闭特别有用。)

从recv的手册:

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

在我看来,上述两种情况都涵盖了相同的场景,只要我首先捕获 EPOLLRDHUP 事件,我就永远不会收到长度为 0 的 read() 或 recv() (因此不需要打扰检查此类)。但这能保证是真的吗?

4

1 回答 1

8

如果您收到一个事件,EPOLLRDHUP=1那么只需立即关闭连接而不阅读。如果你得到一个事件EPOLLRDHUP=0然后EPOLLIN=1继续阅读,但你应该准备好处理recv()仍然返回 0 的可能性,以防万一。也许 a在你得到之后但在你实际调用之前FIN到达。EPOLLIN=1recv()

于 2013-05-10T00:46:59.810 回答