我使用 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|EPOLLHUP 在套接字上退出 Epoll 等待没有问题。
但是,如果我尝试向套接字写入很多内容,直到我得到 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的通信时,在第一种情况下(阅读)我会在几秒钟内收到一次确认请求。但在第二种情况下,我根本没有检测到。