1.pcap_dispatch和pcap_loop使用回调函数结构都一样:
static void process_packet(u_char *user, struct pcap_pkthdr *pHeadr, u_char *pkt_data) { // 如果process_packet定义在类中,那么必须以static修饰
}
2.pcap_dispatch和pcap_loop函数参数都一样:
int pkts_read = -1; // 让libpcap一直抓包,如果pkts_read为1000,则libpcap一次抓1000个包
pcap_loop(handler, pkts_read, (pcap_handler)process_packet, nullptr);
pcap_dispatch(handler, pkts_read, (pcap_handler)process_packet, nullptr);
3.pcap_loop使用较为简单,当网卡收到包,则调用包回调process_packet处理,否则,进程阻塞
4.pcap_dispatch收到包则调用包回调process_packet处理,否则,函数返回
5.pcap_dispatch配合pcap_setnonblock使用,设置libpcap非阻塞方式:
pcap_t *handler = pcap_open_live(...);
...
pcap_setnonblock(handler, 1, ...);
6.pcap_loop不能和pcap_setnonblock关联使用,否则libpcap不能循环抓包。