0

pcap_loop でパケットをキャプチャするために使用している NIC にバインドされたソケットがあります。

最終的に同じデバイスで「読み取り」を行う別のプロセスを実行していますが、それは UNIX ローカル パイプの読み取り準備が整った後でのみです。他のプロセスが pcap_loop を使用して一度にパケットを読み取るように設定されていても、2 番目のプロセスからのデバイスの read() は、一度に 1 つのパケットだけでなく、準備ができているすべてのものを読み取ると言うのは正しいですか?

4

1 に答える 1

2

pcap_loopでパケットをキャプチャするために使用しているNICにバインドされたソケットがあります。

あなたは「ソケット」と言っているので、これはLinuxだと思います(IRIXの場合もありますが、その可能性ははるかに低く、どちらの場合も答えは同じです。他のOSはlibpcapでソケットを使用しません。これらのOSのネイティブキャプチャメカニズムは、ソケット以外のメカニズムを使用します)。

私は別のプロセスを実行していて、最終的には同じデバイスで「読み取り」を実行しますが、UNIXローカルパイプを読み取る準備ができた後でのみです。2番目のプロセスからのデバイスのread()は、一度に1つのパケットだけでなく、準備ができているすべてのものを読み取ると言うのは正しいですか?

いいえ。PF_PACKETソケットは、から一度に1つのパケットを返しますread()

ちなみに、libpcapで同じソケットの読み取りと処理を同時に行うことで、ソケットからの読み取りが機能するという保証はありません。Libpcapは、メモリマップドメカニズムを使用してパケットを取得している可能性があります。メモリマップドメカニズムがread()他の場所でどのように機能するかについてのドキュメントを見たり、Linuxカーネルコードを十分に読んでそれがどのように機能するかを理解していない限り、希望どおりに機能するとは思わないかもしれません。

ただし、これがFreeBSDである場合、タグで示唆されているように(ただし、述べられていません)、libpcapが使用しているのはBPFデバイスであり、ソケットではありません。Aread()は、バッファフルのパケット全体を提供し、libpcapによって実行されるsはread()コールバックをパケットごとに1回呼び出す場合でも、libpcapにバッファフルのパケット全体を提供します。対メモリマップドアクセスの同じ問題read()が発生する可能性がありますが、FreeBSDの新しいバージョンのメモリマップドBPFは、デフォルトではlibpcapによって使用されません。

于 2012-09-25T01:22:01.403 に答える