2017-05-07 2 views
0

poll()システムコールは、ピアがソケットを閉じた後でもPOLLINイベントを返します。 POLLINとPOLLERRの両方が設定されています。そして、これはread()呼び出しが-1を返した後も引き続き起こります。ピアがハングアップした後もPOLLINイベントを返すことができますか?

私のロジックは、ソケットが切断される前に既に到着したパケットを読み込むためにPOLLINがない場合にのみ、POLLERRを処理します。その結果、私はPOLLERが常に設定されているので、POLLERRを処理することはありません。

ソケットエラーの後にpoll()がPOLLERRとともにPOLLINを返すのはなぜですか? このシナリオはどのように処理する必要がありますか。

ありがとうございます!

答えて

0

本当の質問は、あなたがまだソケットをポーリングしている理由と、実際にソケットがまだ存在する理由です。 read()から-1が得られた場合は、ソケットを閉じてポーリングセットから削除する必要があります。あなたがそれをしないと、POLLINは永遠に再発するでしょう。

+0

ディスパッチャスレッドがポーリングを保持し、実際の読み取りを行うためにワーカースレッドに作業項目をポストする非同期モデルがあります。ワーカースレッドはポーリングの読み取りと再有効化のみを行います。私はエラーを検出して処理するためにポーラーに頼っています。 POLLERRがある場合は、おそらくイベントを処理しないはずです。 一般的な質問として - なぜ投票がPOLLINとPOLLERRを返すのですか?ソケットエラーが発生しているときに読み込むデータがあることを意味していませんか? – siri

+1

@siri:人々が 'poll()'を使う主な理由の1つは、IOをワーカースレッドにディスパッチする必要がないためです。なぜ、同じスレッドが 'poll()'、 'recv()'、 'send()'をしないのですか? –

+0

複数の接続で同時に動作するスレッドのグループが必要です。そしてそれらのすべてがポーリングできないので、私はディスパッチャスレッドがポーリングを行い、ワーカースレッドが準備ができているソケットでIOを行うような設計になったのですか? このようなことを行う一般的なパターンは何ですか? – siri

関連する問題