例http://www.tcpdump.org/pcap.htmに従い、ドキュメントを調べたところ、次のコードで何が間違っていたのかわかりません
// main.c
void got_packet(u_char *args, struct pcap_pkthdr *header, const u_char *packet);
/// ...snip...
void got_packet(u_char *args, struct pcap_pkthdr *header, const u_char *packet) {
printf("Received Packet\n");
}
/// ...snip...
pcap_dispatch(handle, 100, got_packet, NULL);
私が見ているコンパイラの警告を保証するために:
gcc -g -O3 -I../sensor/ -c -o sensordatad.o sensordatad.c
main.c: In function ‘start_capture’:
main.c:96:27: warning: initialization from incompatible pointer type [enabled by default]
main.c:146:3: warning: passing argument 3 of ‘pcap_dispatch’ from incompatible pointer
type [enabled by default]
私がうるさくしすぎているのかもしれません。私がこれまでに見た他のすべての C コードには、コンパイル時にコンパイラの警告がページいっぱいに表示されるように思えますが、少なくとも警告なしでこのコードを終了したいのです!
また、関数ポインターを何らかの形で型キャストするために、これを試してみました。これは、どの例にも見られなかったものです。しかし、私は試してみる価値があると感じました:
pcap_handler callback = &got_packet;
/// ...snip...
pcap_dispatch(handle, 100, &callback, NULL);
これにより、同様に困惑するエラーが発生しました。
main.c: In function ‘start_capture’:
main.c:96:27: warning: initialization from incompatible pointer type [enabled by default]
特別な型定義された型を持つ関数ポインターに出くわしたのはこれが初めてです。pcap_{loop,dispatch}
読み取りのマニュアルページ:
名前 pcap_loop, pcap_dispatch - ライブ キャプチャまたは保存ファイルからのパケットを処理する
概要 #include
typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes); int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user); int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user);