我在客户端 - 服务器TCP连接上使用非阻塞读/写epoll_wait.
问题是,我无法使用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信号来表示要读取的实际字节.然后,在后续读取时,您将获得零字节.