質問
私はのpcap形式。 (キャプチャを開始する前に、それが書かれているので、おそらく)この数はPCAPヘッダーで利用できていないようだと、ファイルの「フッタ」は、この情報を、存在していないようです。
だから、私は唯一のアルゴリズムは、すべてのパケットをループにあると信じて、それらを合計します。これはかなり長い、大トレースため、O(N)であります。
私は誰かが賢いアイデアを持っているかどうかを確認するためにここに投稿?
私はそれが私が現在使用している言語であるため、「C」でタグ付けされたが、私はそれは言語独立した問題であると考えています。
解決
ロバート・エドモンズ、pcaputilsの著者は、Wiresharkのパッケージで、私が欲しいものcapinfosを行うプログラムは、すでに存在していることを私に言及しました。それが含まれているパケットの数などのpcapファイルに関する種々の適応症を表示します。
コードソースを読むと、それは順次、ファイル全体を歩いて動作するように表示されます。
他のヒント
のみの方法でファイル全体を読むことです。 (フォーマットは、1回のパスで書き込み可能になるように設計されたため)ファイルヘッダにはパケット数は、実際には、存在しない、と何のフッターは、実際には、ありません。
あなたはPCAPのフレームの数の場合:
をtshark -r test.cap | wc -l
capinfosを使用します:
capinfos test.cap | grep "Number of packets"| tr -d " " | cut -d ":" -f 2
のtcpdumpを使用します:
tcpdump -r test.cap 2>/dev/null| wc -l
だから、基本的に、libpcapのを使用して、ここに例を示します。
#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
unsigned int packet_counter=0;
struct pcap_pkthdr header;
const u_char *packet;
if (argc < 2) {
fprintf(stderr, "Usage: %s <pcap>\n", argv[0]);
exit(1);
}
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
handle = pcap_open_offline(argv[1], errbuf);
if (handle == NULL) {
fprintf(stderr,"Couldn't open pcap file %s: %s\n", argv[1], errbuf);
return(2);
}
while (packet = pcap_next(handle,&header)) {
packet_counter++;
}
pcap_close(handle);
printf("%d\n", packet_counter);
return 0;
}
注:(libpcapのdevの/ develパッケージ用のLinux検索上)のlibpcapヘッダをインストールする必要があります。
そして、gccでコンパイル-o MYPROGRAM myprogram.c -lpcap
私が知っている唯一の方法は、撮影したフレームによって、ファイル、キャプチャしたフレームを読んで、「パケットカウンタをインクリメントすることです。あなたが前方にシークできるよう、保存されたフレームの長さを含む小さなフレームヘッダ、しかし、がありますその長さのファイルに。それは、あなたも速く、心ではないかもしれない。
あなたは、単にキャプチャされたフレームの数をカウント以上のことをやってに興味があるなら、それらをカウントしながら、しかし、それは将来の使用のために、データを読みとキャプチャされたフレームのチェーンを構築する意味があります。 Common Lispのための私のPCAPライブラリは、これを行います。これは、必要に応じて、ディスクからより多くのフレームを読んで、簡単に将来の「次/前の」フレームナビゲーションのための二重リンクリストで生フレームを格納し、として、必要に応じて、「次のフレーム」を読み出します。しかし、フレームの内容の解析には、図書館利用者の裁量に任されており、単にデータ構造にフレームオクテットを読むことによって強制されません。