3

我正在使用 epoll 进行网络编程。我有一个连接列表并将每个客户端都放在列表中。如果用户正常断开连接,我可以通过读取 0 来检测用户断开连接。但是,如果用户以某种方式意外断开连接,那么在它尝试向用户发送数据之前,它无法知道这一点。

我不认为 epoll 提供了一个很好的方法来处理这个..所以我认为我应该自己处理这个。如果你们能为我提供与此问题相关的示例或参考资料,我将不胜感激。

4

2 回答 2

6

如果另一端断开连接,epoll_wait 将为套接字返回 EPOLLHUP 或 EPOLLERR。EPOLLHUP 和 EPOLLERR 是自动设置的,但您也可以设置较新的 EPOLLRDHUP,它明确报告对等关闭。

此外,如果您使用带有标志 MSG_NOSIGNAL 的发送,它将在关闭的连接上设置 EPIPE。

int resp = 发送(袜子,buf,buflen,MSG_NOSIGNAL);

if ( resp == -1 && errno == EPIPE ) { /* 另一边走开 */ }

比收到信号要好得多。

于 2011-06-22T17:44:10.220 回答
0

TCP Keepalives 怎么样:http: //tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html。请参阅“检查死节点”。同一站点的后面部分有示例代码:http ://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html 。

于 2011-06-22T03:00:30.107 回答