libpcapの使い方

前回のコメントでlibpcapの使い方を知りたいということだったので、簡単なlibpcapプログラムを書いた。

“test.pcap”ファイルの各フレームの受信時間と、データリンク層プロトコル番号を表示する。

  1. pcap_open_offlineでpcapファイルを開く
  2. pcap_datalinkでデータリンク層プロトコル番号を取得する
  3. pcap_loopで各フレームに対してpcap_handlerを行う

pcap_loopの第2引数は処理するフレーム数であり-1でEOFまで処理を行う(はず)。

もしdatalinkがEthernet(1)であれば、handlerのdataにはEthernetフレーム以上が入っているので、ネットワーク層プロトコル番号(Ethernet)->トランスポート層プロトコル番号(IP)->DCCPシーケンス番号の順にアクセスする。

[code]
#include
#include

typedef struct {
u_int32_t datalink;
int start_flag;
struct timeval start_ts;
} user_hdr;

void
my_handler(u_char *_user,
const struct pcap_pkthdr *pkthdr,
const u_char *data)
{
user_hdr *user = (user_hdr *)_user;

if (user->start_flag == 0)
{
user->start_ts = pkthdr->ts;
user->start_flag = 1;
}
struct timeval ts;
timersub(&pkthdr->ts,
&user->start_ts,
&ts);

printf(“%lu.”, ts.tv_sec);
printf(“%06lu “, ts.tv_usec);
printf(“%u “, user->datalink);
printf(“\n”);
}

int
main()
{
const char *fname = “test.pcap”;

char *errbuf = NULL;
pcap_t *pcap = pcap_open_offline(fname, errbuf);

user_hdr *user = (user_hdr *)malloc(sizeof(user_hdr));
user->datalink = pcap_datalink(pcap);
user->start_flag = 0;

pcap_loop(pcap,
-1,
(pcap_handler)my_handler,
(u_char *)user);

free(user);

return 0;
}
[/code]

後はTCPもしくはDCCPのシーケンス番号が欲しければ10〜20行くらい書けば表示できる。ただしDCCPの場合はext seqがあるので少し面倒。

書いた後で思ったが、かなり行数少ない。シーケンス図やスループット図を描く為ならEtherealよりお勧めだなー。

noch について

無線LANをこよなく愛する虚言者。
カテゴリー: 無線LAN パーマリンク

libpcapの使い方 への2件のフィードバック

  1. yusuke のコメント:

    うわー、ありがとう。
    なかなかそちらへ行けなくなってしまったのでありがたい。

    これはきっと役に立つ

  2. ピンバック: cialis

コメントを残す

メールアドレスが公開されることはありません。