2

タイムアウト付きの Pcap を使用してリッスンしているstackoverflow.com でこの投稿を見つけました

私は同様の (しかし異なる) 問題に直面しています: libpcap パケット受信関数を使用してキャプチャされたパケットを受信するときに定期的にタイムアウトする GENERIC (プラットフォームに依存しない) メソッドは何ですか? 実際、pcap_dispatch(pcap_t...) / pcap_next_ex(pcap_t...) から定期的にタイムアウトできるかどうか疑問に思っています。それが可能であれば、従来の select(...timeout) 関数 ( http://linux.die.net/man/2/select ) を使用するのと同じように使用できます。

さらに、公式 Web ページ ( http://www.tcpdump.org/pcap3_man.html ) から、元のタイムアウト メカニズムにはバグがあり、プラットフォーム固有であると見なされていることがわかりました (私のプログラムは別の Linux で実行される可能性があり、これは悪いことです)。 Unix ボックス):
"... ... to_ms は、読み取りタイムアウトをミリ秒単位で指定します。読み取りタイムアウトは、パケットが検出されたときに読み取りが必ずしもすぐに返されるわけではなく、許可されるまである程度の時間待機するように調整するために使用されます。より多くのパケットが到着し、1 回の操作で OS カーネルから複数のパケットを読み取る必要があります.すべてのプラットフォームが読み取りタイムアウトをサポートしているわけではありません.サポートしていないプラットフォームでは、読み取りタイムアウトは無視されます... ...
注: ライブ キャプチャを読み取る場合、読み取りがタイムアウトしたときに pcap_dispatch() が返されるとは限りません。一部のプラットフォームでは読み取りタイムアウトがサポートされておらず、他のプラットフォームでは、少なくとも 1 つのパケットが到着するまでタイマーが開始されません。これは、たとえば対話型アプリケーションで、パケット キャプチャ ループがユーザー入力を定期的に「ポーリング」できるようにするために、読み取りタイムアウトを使用しないことを意味します。 ……」

したがって、以下のように GENERIC (プラットフォームに依存しない) タイムアウト メカニズムを自分で実装する必要があるのではないでしょうか?

  1. pcap_open_live() で pcap_t 構造体を作成します。
  2. pcap_setnonblock(pcap_t...) でノンブロッキング モードに設定します。
  3. 次のように、登録された OS タイマーを使用して、この非ブロッキング pcap_t をポーリングします。

OS timer_x を登録し、timer_x をリセットします。

ながら(1) {

if(timer_x time out) {定期的に実行する必要があることを実行します。timer_x をリセット;}

pcap_dispatch(pcap_t...)/pcap_next_ex(pcap_t...) を呼び出して pcap_t をポーリングし、いくつかのパケットを受信します。
これらのパケットで何かをします。

}//while(1) の終わり

よろしく、
DC

4

1 に答える 1

2

pcap_fileno() と select() でハンドルを取得できます。ここの OfferReceiver::Listen() にサンプルがあります。

于 2011-07-27T08:03:10.530 に答える