EPOLLRDHUP不可靠

时间:2014-11-27 16:35:11

标签: tcp epoll

我通过与epoll_wait的客户端 - 服务器TCP连接使用非阻塞读/写。

问题是,我无法可靠地检测到对等关闭连接'使用EPOLLRDHUP标志的事件。经常发生的是没有设置标志。客户端使用close(),服务器大多数时间从epoll_wait收到EPOLLIN | EPOLLRDHUP个事件。正如预期的那样,读取产生零字节。但有时只会EPOLLIN出现,产生零字节。

使用tcpdump进行调查显示,就我所知,正常关机发生。我看到一个Flags [F.], Flags [F.], Flags [.]事件序列,应该对应FIN,FIN和ACK。 SO_LINGER无处使用。

我考虑过处理同伴关闭'但是,对于零字节读取,当对等体发送&时,有可能获得具有非零字节的EPOLLIN | EPOLLRDHUP事件。立即关闭连接 - 我需要以EPOLLRDHUP为基础的情况。建议?

1 个答案:

答案 0 :(得分:7)

要回答这个问题:如果在收到零字节读取后继续轮询,确实会出现EPOLLRDHUP。 因此,根据我的实验,看起来像EPOLLIN具有零字节读取或EPOLLRDHUP是有序关闭的可靠指标,唯一的问题是,它们不是一起收到的。有时(产生这个问题的主题的情况),接收到EPOLLIN,产生零字节(连接终止),并且在随后的轮询中你会看到EPOLLRDHUP。其他时候,反之亦然:你得到EPOLLRDHUP和一个EPOLLIN,它表示要读取的实际字节。然后,在后续读取时,您将获得零字节。