0

リモートホストが正常に接続をシャットダウンした場合、epollを報告EPOLLINし、呼び出しreadまたはrecvブロックせず、0 バイト (つまり、ストリームの終わり) を返すことを私は知っています。

ただし、接続が正常に閉じられず、writeまたはsend操作が失敗した場合、これによりepoll、その後そのソケットが返さEPOLLINれ、同じ/類似のストリーム シナリオの終わりが生成されますか?

この動作に関するドキュメントを見つけようとしましたが、成功しませんでした。テストはできましたが、特定のカーネル バージョンの特定のディストリビューションで何が起こるかについては興味がありません。

4

4 に答える 4

2

実際、仕様から完全に明らかではありませんが、 に対して次のように機能しますpoll()

  • 接続が閉じられていても、読み取ることができるデータがある場合は、POLLINが返されます。
  • 接続が閉じられているために読み取りも書き込みもできない場合、POLLHUPまたはPOLLERR返されます。
  • 読み取りはできなくなったが書き込みは可能になった場合 (相手が を行った場合などshutdown(SHUT_WR))、POLLINは返されPOLLHUP、は返さPOLLERRれません。POLLOUT(これにより、正常に待機できます。)

簡単なことはPOLLIN、 、 、POLLHUPのいずれかPOLLERRが設定されているときに読み取りを試みることです。

では、トリガーされる可能性kqueue()のあるフィルタが 1 つだけあります。EVFILT_READこれはマニュアルページに記載されており、十分に明確なはずです。

TCP キープアライブを有効にしない場合 (FreeBSD ではデフォルトで有効になっていますが、他のほとんどのオペレーティング システムでは無効になっています)、ネットワークが特定の方法で切断された場合、データの読み取りを待機することで永久にスタックする可能性があることに注意してください。TCP キープアライブがオンになっていても、切断された接続を検出するのに数時間かかる傾向があります。

于 2013-11-17T00:43:47.063 に答える