2010-11-23 9 views
3

私のプロジェクトにlibnetfilter_queueを使用しています。 From C appキューは "queue file descriptor"によってアクセス可能です。私はそれらを処理するために5つのキューと5つのスレッドを持っています。私が達成したいのは、キューに正確に2つのパケットがあるときにスレッドをスリープ状態にすることです。 select関数とintの配列を使って、各キューにどれくらいのパケットがキューに入っているかを示すアイディアを思いついた。私はどのキューがパケットを受信したかチェックし、値が2より大きければ、スレッドを起動します。すべてが問題ありませんが、recvを呼び出すまでキューにはデータがあり、別のスレッドがこれらのパケットを処理する必要があるため、キューを読むことができません。誰もがこの問題を解決する方法を知っていますか?私はSO_RCVLOWATを設定することができますが、私はその2つのパケットのサイズがわからないので、私の問題は解決しません。2パケットを受信した後にスレッドをスリープ状態にする方法

+0

なぜこのようなものが必要でしょうか? – jalf

答えて

3

東武で推奨されているように、epollは良い選択であり、selectよりも優れています。 しかし、これらのポーリング機能のほとんどは、誰かが読んでいない限り、イベント(データが利用可能)があることを示します。 可能であれば、次のモデルを使用してください。 epoll/selectを使用して、着信データがワーカースレッドを起動するのを監視します。 実際に作業を行う前に、ワーカースレッドがデータ(1つのパケット、2つ以上)で何をすべきかを決定させます。

OR: 1つのリーダースレッド - Nワーカースレッド:すべての受信データを待機して読み込み、それを対応するワーカースレッドのキューにポストするためにepollを使用します。 パケットの数がしきい値に達すると、(セマフォを使用して)ワーカースレッドを起動します。

1

利用可能なデータの量が変更されたときに送信されるエッジトリガーイベント通知 - 通知を探しています。 epollは、EPOLLETフラグを使用するときのように機能し、デフォルトでは通知をリセットして、新しいパケットの通知を継続します。

2回のepoll_waitコールの間に複数のパケットが到着した場合は、一度だけ通知されます。

+0

あなたの意見が分かります。 epoll_waitコールの間に時間がかかり過ぎると、1つ以上のパケットが受信されたときに、受信したパケットの数を判断できません。その情報をありがとう – pejotr

+0

利用可能なデータの量が変化したとき、または空から空でないとき(受信バッファ用)になったときは本当ですか? –

+0

私はそれが前者だと確信しています:パケットが到着するたびに。カーネルコードのjustsは、ep_poll_callbackが呼び出されたときにフラグを設定し、その時点でバッファがいっぱいだったかどうかを追跡しません。 – Tobu

関連する問題