gpt4 book ai didi

linux - 在写阻塞套接字上使用 TCP Keep-Alive 获取断开连接通知

转载 作者:IT王子 更新时间:2023-10-29 00:48:57 25 4
gpt4 key购买 nike

我使用 TCP Keep-Alive 选项来检测死连接。它适用于使用读取套接字的连接:

setsockopt(mysock,...) // set various keep alive options

epoll_ctl(ep,mysock,{EPOLLIN|EPOLERR|EPOLLHUP},)
epoll_wait -> (exits after several seconds when remove host disconnects cable)

Epoll 等待退出,套接字上的 EPOLLIN|EPOLLHUP 没有问题。

但是,如果我尝试向套接字写入大量数据直到获得 EAGAIN,然后轮询读取和写入,当我断开电缆连接时我不会收到错误消息:

setsockopt(mysock,...) // set various keep alive options

while(send() != EAGAIN)
;
epoll_ctl(ep,mysock,{EPOLLIN|EPOLLOUT|EPOLERR|EPOLLHUP},)
epoll_wait -> --- Never exits!!!! even when the cable of the remove host is disconnected!!!
  • 如何解决?
  • 有人遇到过类似的问题吗?
  • 有什么可能的方向吗?

编辑:附加信息

当我监控与 wireshark 的通信时,在第一种情况下(读取)我每隔几秒收到一次 ack 请求。但在第二种情况下,我根本没有检测到。

最佳答案

如果在传输所有数据之前拉网络连接,则连接不会空闲,因此在某些实现中保活计时器不会启动。 (请记住,keepalive 不是 TCP 规范的一部分,因此即使有的话,它的实现也不一致。)通常,由于指数退避和大量重试的组合 (tcp_retries2默认为 15) 在保活计时器启动之前,传输重试超时最多可能需要 30 分钟。

解决方法(如果有的话)取决于您使用的特定 TCP 实现。一些较新版本的 Linux(2011 年 1 月 4 日发布的内核版本 2.6.37)实现了 TCP_USER_TIMEOUT。更多信息 here .

通常的建议是在应用程序级别实现通信超时,而不是使用基于 TCP 的保活。参见,例如,HTTP Keep-Alive .

关于linux - 在写阻塞套接字上使用 TCP Keep-Alive 获取断开连接通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com