libevent を使用してネットワーク プログラムのプログラミングを行っています。
このプログラムでは、libpcap を使用してパケットをキャプチャし、これらのパケットを変更してから送信します。これらの手順はリアルタイムで行う必要があります。
そこで、ライブ キャプチャを作成し、pcap_get_selectable_fd を使用してライブ キャプチャのファイル記述子を取得し、libevent ループにpcap_fd
READ_EV イベントを追加します。pcap_fd
とにかく、ファイル記述子をポーリングする select() または epoll() のようなものです。
しかし、プログラムが期待どおりに動作しないことに気付いたので、tcpdump といくつかのデバッグ ログを使用して問題を確認します。ポーリングpcap_fd
が正しく機能しないことがあります。たとえば、最初は正常に機能しているように見えます。しばらくして、 の READ_EV イベントpcap_fd
が 2 秒後にトリガーされますが、これは実際には大きな遅延です。
マニュアルを読んだところ、次のように書かれています。
pcap_get_selectable_fd(3) will return a file descriptor. But simple select()
or poll() will not indicate that the descriptor is readable
until a full buffer's worth of packets is received, even if the read
timeout expires before then.
ライブ キャプチャは約 15 パケット (それぞれが 66 バイト) をキャプチャしたようですが、READ_EV イベントは 2 秒後までトリガーされません。しかし、最初は 1 つのパケットの到着でも READ_EV イベントをトリガーできます。これは非常に不安定であることを意味します。
To work around this, an application that
uses select() or poll() to wait for packets to arrive must put the
pcap_t in non-blocking mode, and must arrange that the select() or
poll() have a timeout less than or equal to the read timeout, and must
try to read packets after that timeout expires, regardless of whether
select() or poll() indicated that the file descriptor for the pcap_t is
ready to be read or not.
私の質問は上記の段落です。
1 タイムアウトには、読み取りタイムアウトと自分で定義したタイムアウトの 2 つがあるようですが、読み取りタイムアウトとは何ですか?
pcap_next()
2 非常に短いタイムアウトを設定し、またはを使用してライブ キャプチャをポーリングする必要があるように思えますが、そうpcap_dispatch
ですか? 私のポーリングは非常にCPUを消費する可能性がありますか?
ありがとう!</p>