1

WinPcap 4.1.2 を使用して、特定のインターフェイスですべての IP ベースのトラフィックを収集し、レイヤー 7 処理のためにユーザーが選択した TCP および UDP ベースの「会話」をフィルタリングする必要があります。着信フレームごとに一意にタグを付ける必要があるため、pcap_tデバイスごとに一意のフィルターを持つ複数のデバイスを持つという明白なソリューションを使用することはできません。代わりに、単一のpcap_tデバイスでデータを収集し、各フレームにタグを付けてから、pcap_offline_filterAPI を利用して、選択した各「会話」を個別のスレッドでフィルター処理します (つまり、X の会話は X の異なるスレッドでフィルター処理されます)。このアプリケーションが実行されるマルチコア システム。

質問は簡単です。pcap_offline_filterAPI はスレッドセーフですか?

4

1 に答える 1

2

pcap_offline_filter()複数のインスタンスによって共有されるグローバル データがないため、他のスレッドでその引数を変更しない限り(そうする理由はありません。たとえば、コンパイルされたフィルター構造を変更する必要はありません。フィルタリングの途中、またはフィルタリング中にパケットヘッダーまたはデータを変更するなど)、スレッドセーフです。

(pcap_compile()ただし、それ自体はスレッドセーフではありません。これは YACC パーサーと Lex 字句解析器に基づいており、yacc や Bison、Lex や Flex がデフォルトでスレッドセーフ コードを生成するとは思いませんし、コード ジェネレーターもにはグローバル変数があります. 同じスレッドでフィルタ式をコンパイルすることを確認してください. 複数のスレッドにこれらの式を使用pcap_offline_filter()させるconst struct bpf_program *ことができます.ただし、フィルターは変更しません。これは、構造体が指す とstruct bpf_programの配列の両方に適用されます。)struct bpf_insns

于 2012-11-24T20:19:18.660 に答える