我正在使用 epoll 进行网络编程。我有一个连接列表并将每个客户端都放在列表中。如果用户正常断开连接,我可以通过读取 0 来检测用户断开连接。但是,如果用户以某种方式意外断开连接,那么在它尝试向用户发送数据之前,它无法知道这一点。
我不认为 epoll 提供了一个很好的方法来处理这个..所以我认为我应该自己处理这个。如果你们能为我提供与此问题相关的示例或参考资料,我将不胜感激。
我正在使用 epoll 进行网络编程。我有一个连接列表并将每个客户端都放在列表中。如果用户正常断开连接,我可以通过读取 0 来检测用户断开连接。但是,如果用户以某种方式意外断开连接,那么在它尝试向用户发送数据之前,它无法知道这一点。
我不认为 epoll 提供了一个很好的方法来处理这个..所以我认为我应该自己处理这个。如果你们能为我提供与此问题相关的示例或参考资料,我将不胜感激。
如果另一端断开连接,epoll_wait 将为套接字返回 EPOLLHUP 或 EPOLLERR。EPOLLHUP 和 EPOLLERR 是自动设置的,但您也可以设置较新的 EPOLLRDHUP,它明确报告对等关闭。
此外,如果您使用带有标志 MSG_NOSIGNAL 的发送,它将在关闭的连接上设置 EPIPE。
int resp = 发送(袜子,buf,buflen,MSG_NOSIGNAL);
if ( resp == -1 && errno == EPIPE ) { /* 另一边走开 */ }
比收到信号要好得多。
TCP Keepalives 怎么样:http: //tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html。请参阅“检查死节点”。同一站点的后面部分有示例代码:http ://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html 。