我已经在网络电缆拔出时测试了epoll:
server_fd添加到epoll中telnet)并将client_fd添加到epollepoll_wait永远不会收到任何与client_fd相关的事件。我想在这种情况下检测错误。还有其他的解决办法吗?应用程序需要实现心跳方法来自我检测吗?
发布于 2015-07-09 13:54:09
你在这里有两个选择:
要启用和配置TCP保持活动,需要使用client_fd更改setsockopts(2)套接字选项。有3个参数需要检查/更改:
TCP_KEEPCNT --这是在任何给定时间都允许的未答复的未答复探测的数量。如果在给定的时间间隔内发送多个TCP_KEEPCNT探测而没有答复,则假定连接已死亡。TCP_KEEPIDLE -在探测数据包开始发送之前,连接需要空闲的时间。TCP_KEEPINTVL -单个探针之间的时间。所以,你在client_fd上做这样的事情
int tcp_keepcnt = 3;
int tcp_keepidle = 30;
int tcp_keepintvl = 60;
setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPCNT, &tcp_keepcnt, sizeof(tcp_keepcnt));
setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &tcp_keepidle, sizeof(tcp_keepidle));
setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPINTVL, &tcp_keepintvl, sizeof(tcp_keepintvl));断开的连接被epoll(7)报告为可读的,并带有EPOLLHUP标志。注意,如果没有EPOLLHUP,订单关闭将报告为可读性,但read(2)将返回0。
请记住,检测死的连接不是即时的。这需要一段时间。例如,使用上述参数,大约需要3分钟。
发布于 2015-07-09 05:03:11
Telnet服务器使用TCP使其保持活力;事实上,这正是它的真正目的。
您可以每隔一段时间发送一个不存在的Telnet命令。
这两种情况最终导致了ECONNRESET。
https://stackoverflow.com/questions/31307369
复制相似问题