私はC ++でlibpcapを使用しています。キャプチャをファイルに保存したいので、これを使用します:
if ((pcount = pcap_loop (p, -1, &pcap_dump, (char *) pd)) < 0)
{
pcap_perror (p, prestr);
}
必要なときにキャプチャを停止してデータを保存するにはどうすればよいですか?
ありがとう。
あなたの質問には2つの部分があります。停止方法と保存方法です。それぞれ順番に処理しましょう。
キャプチャを「停止」する方法
要するに、キャプチャを「停止」するのではなく、限られた量をキャプチャし、それで十分かどうかを確認します。
pcap
ドキュメントは、2 番目の引数がキャプチャするパケットの数であることを示しています。を指定すること-1
で、エラーになるまでキャプチャするようにシステムに指示します。
他の条件 (たとえば、システムの他の部分によって設定された変数) をチェックする場合は、おそらくpcap_loop
の引数-1
は適切ではありません。pcap
ドキュメントの他のオプションはより適切に見えます:
pcap_next
次のパケットを取得するだけなので、すべてのパケットの後に確認できます。OR
pcap_dispatch
パケットのバッチを処理します
出力を保存しようとしていることを考えると、pcap_dispatch
おそらくより良い選択です。次のようなものです:
while (something_tells_me_to_keep_going) {
// process one buffer-full (error handling removed for brevity)
pcap_dispatch(p, -1, &pcap_dump, (char*) pd);
// possibly update something_tells_me_to_keep_going, based on time or whatever
}
データの保存方法
コールバック ハンドラを指定しましたpcap_dump
。これは、以前に で開いたファイルにパケット データをダンプするように設計されていますpcap_dump_open
。おそらく、(または)への呼び出しの前に、次のようなものがある(または必要になるpcap_loop
)pcap_dispatch
:
pcap_dumper_t *pd = pcap_dump_open(p, "my_save_file.pcap");
...などで作成しp
たpcap_t*
ストリームはどこにありましたか。pcap_open_live
(この関数の使用を明確にする libcap 作成者からのこのメモを参照してください)。
最後に、完了したら、次のようにファイルを閉じます。
pcap_dump_close(pd);
参考文献: