首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用epoll检测网络电缆拔出错误

用epoll检测网络电缆拔出错误
EN

Stack Overflow用户
提问于 2015-07-09 03:01:05
回答 2查看 416关注 0票数 0

我已经在网络电缆拔出时测试了epoll

  • 服务器打开端口3000
  • 创建epoll并将server_fd添加到epoll中
  • 接受客户端(客户端使用telnet)并将client_fd添加到epoll
  • 向客户端发送数据
  • 拔掉电缆后,epoll_wait永远不会收到任何与client_fd相关的事件。

我想在这种情况下检测错误。还有其他的解决办法吗?应用程序需要实现心跳方法来自我检测吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-09 13:54:09

你在这里有两个选择:

  • 实现应用层心跳。换句话说,您编写的代码可以检测空闲连接,并定期发送应用层消息,以本质上探测连接并确保它仍然处于打开状态。
  • 你使用TCP保持活着。这基本上将实现和处理心跳消息的工作转移到TCP层。在你的情况下这似乎是个不错的选择。

要启用和配置TCP保持活动,需要使用client_fd更改setsockopts(2)套接字选项。有3个参数需要检查/更改:

  • TCP_KEEPCNT --这是在任何给定时间都允许的未答复的未答复探测的数量。如果在给定的时间间隔内发送多个TCP_KEEPCNT探测而没有答复,则假定连接已死亡。
  • TCP_KEEPIDLE -在探测数据包开始发送之前,连接需要空闲的时间。
  • TCP_KEEPINTVL -单个探针之间的时间。

所以,你在client_fd上做这样的事情

代码语言:javascript
复制
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分钟。

票数 1
EN

Stack Overflow用户

发布于 2015-07-09 05:03:11

Telnet服务器使用TCP使其保持活力;事实上,这正是它的真正目的。

您可以每隔一段时间发送一个不存在的Telnet命令。

这两种情况最终导致了ECONNRESET

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31307369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档