1

私はC ++でlibpcapを使用しています。キャプチャをファイルに保存したいので、これを使用します:

  if ((pcount = pcap_loop (p, -1, &pcap_dump, (char *) pd)) < 0)
    {
      pcap_perror (p, prestr);
   }

必要なときにキャプチャを停止してデータを保存するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

3

あなたの質問には2つの部分があります。停止方法と保存方法です。それぞれ順番に処理しましょう。

  1. キャプチャを「停止」する方法

    要するに、キャプチャを「停止」するのではなく、限られた量をキャプチャし、それで十分かどうかを確認します。

    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
    }
    
  2. データの保存方法

    コールバック ハンドラを指定しましたpcap_dump。これは、以前に で開いたファイルにパケット データをダンプするように設計されていますpcap_dump_open。おそらく、(または)への呼び出しの前に、次のようなものがある(または必要になるpcap_looppcap_dispatch

        pcap_dumper_t *pd = pcap_dump_open(p, "my_save_file.pcap");
    

    ...などで作成しppcap_t*ストリームはどこにありましたか。pcap_open_live

    (この関数の使用を明確にする libcap 作成者からのこのメモを参照してください)。

    最後に、完了したら、次のようにファイルを閉じます。

    pcap_dump_close(pd);
    

参考文献:

于 2012-04-13T09:25:13.023 に答える