我正在使用 epoll_wait
通过客户端-服务器 TCP 连接使用非阻塞读/写。
问题是,我无法使用 EPOLLRDHUP
标志可靠地检测“对等关闭连接”事件。经常发生标志未设置的情况。客户端使用 close()
,而服务器大部分时间从 epoll_wait
接收 EPOLLIN | EPOLLRDHUP
事件。正如预期的那样,读取产生零字节。但有时,只有 EPOLLIN
出现,产生零字节。
使用 tcpdump
的调查表明,据我所知,正常关闭发生了。我看到一个 Flags [F.], Flags [F.], Flags [.]
事件序列,它应该对应于 FIN、FIN 和 ACK。 SO_LINGER
无处使用。
我考虑过在零字节读取时处理“对等点关闭”,但是,当对等点发送并立即关闭连接时,您可能会收到一个 EPOLLIN | EPOLLRDHUP
事件,并且可用非零字节在 EPOLLRDHUP
上。建议?
最佳答案
要回答这个问题:如果您在收到零字节读取后继续轮询,则确实会出现 EPOLLRDHUP
。
所以从我的实验来看,无论是零字节读取的 EPOLLIN
还是 EPOLLRDHUP
都是有序关闭的可靠指标,唯一的问题是,它们没有一起接收。有时(成为这个问题的主题的情况),碰巧收到 EPOLLIN,产生零字节(连接终止),在随后的轮询中,您会看到 EPOLLRDHUP
。其他时候,反之亦然:您将 EPOLLRDHUP
与 EPOLLIN
放在一起,该 ojit_code 表示要读取的实际字节。然后,在后续读取中,您将获得零字节。
关于tcp - EPOLLRDHUP 不可靠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27175281/