【发布时间】:2011-09-20 05:46:31
【问题描述】:
你们能否为我提供一个使用 EPOLLHUP 处理死节点的良好示例代码?我知道这是检测用户断开连接的信号,但不确定如何在代码中使用它..提前谢谢..
【问题讨论】:
-
(冒昧添加了 epoll 和 linux 标签,因为 Q 与此有关)
标签: linux networking epoll
你们能否为我提供一个使用 EPOLLHUP 处理死节点的良好示例代码?我知道这是检测用户断开连接的信号,但不确定如何在代码中使用它..提前谢谢..
【问题讨论】:
标签: linux networking epoll
您使用EPOLLRDHUP 来检测对等关闭,而不是EPOLLHUP(它表示套接字意外关闭,即通常是内部错误)。
使用它非常简单,只需将标志与您提供给epoll_ctl 的任何其他标志一起“或”。因此,例如,而不是 EPOLLIN 写 EPOLLIN|EPOLLRDHUP。
在epoll_wait 之后,执行if(my_event.events & EPOLLRDHUP),然后在对方关闭连接时执行任何您想要执行的操作(您可能想要关闭套接字)。
请注意,从套接字读取时获得“零字节读取”结果也意味着另一端已关闭连接,因此您也应始终检查这一点,以避免令人讨厌的意外(FIN 可能会在您从EPOLLIN 醒来后到达,但在您调用read 之前,如果您处于 ET 模式,您将无法获得另一个通知)。
【讨论】:
read 将返回“读取零字节”时,必须已经设置了EPOLLRDHUP。在实践中,我看到在边缘触发模式下发生了奇怪的事情(据我所知,水平触发在各方面都是 100% 可靠的),这与文档所说的也不完全一致。因此,为了 100% 安全,在边沿触发模式下,我会检查 read 是否返回“零读取”,只是为了确定。它并没有真正花费任何成本,它让您处于 100% 的故障安全位置。