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 との通信を監視すると、最初のケース (読み取り) で、数秒に 1 回 ack の要求を受け取ります。しかし、2 番目のケースでは、まったく検出されません。