7

epoll_ctl のマニュアルから:

EPOLLRDHUP (Linux 2.6.17 以降)

ストリーム ソケット ピアが接続を閉じたか、接続の半分を書き込んでシャットダウンしました。(このフラグは、エッジ トリガー監視の使用時にピアのシャットダウンを検出する単純なコードを記述する場合に特に役立ちます。)

recv のマニュアルから:

受信可能なメッセージがなく、ピアが正常なシャットダウンを実行した場合、recv() は 0 を返します。

上記の両方が同じシナリオをカバーしているように思えます.EPOLLRDHUPイベントを最初にキャッチする限り、長さ0の read() または recv() を受け取ることはありません(したがって、気にする必要はありません)などをチェックします)。しかし、これは真実であると保証されていますか?

4

1 に答える 1

8

でイベントを取得した場合は、EPOLLRDHUP=1読み取らずにすぐに接続を閉じてください。でイベントを取得してEPOLLRDHUP=0から先に進んでも、0 が返さEPOLLIN=1れる可能性に対処する準備をしておく必要があります。recv()おそらく、を取得した後、実際に を呼び出す前にaFINが到着します。EPOLLIN=1recv()

于 2013-05-10T00:46:59.810 に答える