我通过与epoll_wait
的客户端 - 服务器TCP连接使用非阻塞读/写。
问题是,我无法可靠地检测到对等关闭连接'使用EPOLLRDHUP
标志的事件。经常发生的是没有设置标志。客户端使用close()
,服务器大多数时间从epoll_wait
收到EPOLLIN | EPOLLRDHUP
个事件。正如预期的那样,读取产生零字节。但有时只会EPOLLIN
出现,产生零字节。
使用tcpdump
进行调查显示,就我所知,正常关机发生。我看到一个Flags [F.], Flags [F.], Flags [.]
事件序列,应该对应FIN,FIN和ACK。 SO_LINGER
无处使用。
我考虑过处理同伴关闭'但是,对于零字节读取,当对等体发送&时,有可能获得具有非零字节的EPOLLIN | EPOLLRDHUP
事件。立即关闭连接 - 我需要以EPOLLRDHUP
为基础的情况。建议?
答案 0 :(得分:7)
要回答这个问题:如果在收到零字节读取后继续轮询,确实会出现EPOLLRDHUP
。
因此,根据我的实验,看起来像EPOLLIN
具有零字节读取或EPOLLRDHUP
是有序关闭的可靠指标,唯一的问题是,它们不是一起收到的。有时(产生这个问题的主题的情况),接收到EPOLLIN,产生零字节(连接终止),并且在随后的轮询中你会看到EPOLLRDHUP
。其他时候,反之亦然:你得到EPOLLRDHUP
和一个EPOLLIN
,它表示要读取的实际字节。然后,在后续读取时,您将获得零字节。