2013-04-08 180 views
0

已经跟着例子http://www.tcpdump.org/pcap.htm,探索的文件,我看不到有什么我做错了用下面的代码编译器警告libpcap的

// 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] 

这是我第一次在函数指针的特殊Typedef的类型运行,该男子对于pcap_{loop,dispatch}页上写着:

NAME pcap_loop, pcap_dispatch - process packets from a live capture or savefile

SYNOPSIS #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); 

回答

0

解决

函数签名应该是:

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); 

我:

void got_packet(u_char *args, struct pcap_pkthdr *header, const u_char *packet); 

我在某些方面的错误是有道理的假设?但无论如何解决。