3

私はepollを使ったネットワークプログラミングに取り組んでいます。私は接続リストを持っており、すべてのクライアントをリストに入れています。ユーザーが正常に切断された場合、0を読み取ることでユーザーの切断を検出できます。ただし、ユーザーが予期せず切断された場合は、ユーザーにデータを送信しようとするまで、これを知る方法はありません。

epollがこれを処理する良い方法を提供するとは思わないので、私はこれを自分で処理する必要があると思います。この問題に関連する例や参考資料のようなものを提供していただければ幸いです。

4

2 に答える 2

6

epoll_waitは、反対側が切断された場合、ソケットのEPOLLHUPまたはEPOLLERRを返します。EPOLLHUPとEPOLLERRは自動的に設定されますが、ピアのシャットダウンを明示的に報告する新しいEPOLLRDHUPを設定することもできます。

また、フラグMSG_NOSIGNALを指定してsendを使用すると、閉じた接続にEPIPEが設定されます。

int resp = send(sock、buf、buflen、MSG_NOSIGNAL);

if(resp == -1 && errno == EPIPE){/*反対側が消えた*/}

信号を受信するよりもはるかに優れています。

于 2011-06-22T17:44:10.220 に答える
0

TCPキープアライブについてはどうですか:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html。「デッドピアのチェック」を参照してください。同じサイトの後のセクションには、サンプルコードがあります:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html

于 2011-06-22T03:00:30.107 に答える