5

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 番目のケースでは、まったく検出されません。

4

3 に答える 3