我使用TCP Keep-Alive选项检测死连接。它与连接是否正常使用阅读插座:使用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)
与EPOLLIN是Epoll等待退出| 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几秒请求获得一次。但在第二种情况下,我根本没有发现它们。
TCP保持活动状态在两小时后运行,而不是几秒钟。你确定你不是指'阅读超时'吗? – EJP 2013-05-01 22:54:39
@EJP有修改保持活动时间的选项 - 这就是我在setsockopts中做的事情......以便在几秒钟内检测到问题。因此,如果我拔掉远程端的电缆,并且读取轮询插座(第一个示例),则会在几秒钟内检测到断开连接...但第二种情况不会。 – Artyom 2013-05-02 03:59:23
调用epoll_ctl(...)时是否检查错误? – user2343912 2013-05-06 08:38:42