如何检测 TCP 连接中的死链接?当有人拉扯网线、关闭网络接口、打开 WiFi 或者像我这样......拔掉电源时,就会发生死链接。
Keep-alive 只对客户端有效,对服务器无效。
服务器只是接收数据,从不发送,因此使用 TCP_USER_TIMEOUT 将不起作用,因为发送 q 将始终为空。
我不想实现速度损失的应用层协议原因。(不再是零拷贝)
有效的一件事是发送 oob 数据,但因为你不应该再使用它了......
在下面编写的测试之后,您将看到客户端连接将在预期的短时间内关闭。 但是服务器会认为它已连接,永远......到目前为止等了3小时......
到目前为止,我在 3.13(Kubuntu) 和 3.18(OpenWrt) Linux 内核上对此进行了测试。这是一个错误吗?到目前为止,我已经阅读了很多 tcp/socket 编程书籍......根本没有帮助。请伙计们我需要你的帮助:)
我正在使用异步/非阻塞 io (epoll),因此发送和 rcv 超时也不起作用。
UPDATE2:现在有 x64/x86 的剪切源
添加:我以为我可以通过 epoll 事件捕获错误。
但是如果发生错误,我是否需要询问套接字?
#define MAX_EVENTS 64
#define CON_RETRY_TIMEOUT 10 /* time to wait in sec until next connect attempt */
#define CON_TIMEOUT 10 /* time in sec after which stop trying to connect */
#define CON_IDLE 10 /* time in sec after which …Run Code Online (Sandbox Code Playgroud)