同样是使用数据包捕获开发包, 这次采用的捕包函数不同,pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 其中,p是Libpcap句柄,参数cnt代表捕获数据包的个数,如果是-1则捕获无限多个,后面两个参数分别代表回调函数和回调函数的参数。此函数的功能是循环捕获数据包,每捕获一个数据包就调用一次回调函数。
#include <pcap.h>
void packet_callback(u_char *argument, const struct pacp_pkthdr *packet_header, const u_char packet_content)
{
static int packet_number = 1;
printf("the %d packet is captured./n", packet_number);
packet_number++;
}
void main()
{
pcap_t *pcap_handle;
char error_content;
char *net_interface;
struct bpf_program bpf_filter;
char bpf_filter_string []= "ip";
bpf_u_int32 net_mask;
bpf_u_int32 net_ip;
net_interface = pcap_lookupdev(error_content);
pcap_lookupnet(net_interface,
&net_ip,
&net_mask,
error_content);
/*net addresss & mask*/
pcap_handle = pcap_open_live(net_interface,
BUFSIZ,
1,
0,
error_content);
pcap_compile(pcap_handle,
&bpf_filter,
bpf_filter_string,
0,
net_ip);
pcap_setfilter(pcap_handle,
&bpf_filter);
pcap_loop(pcap_handle,
10,
packet_callback,
NULL);
pcap_close(pcap_handle);
}
这段程序就是简单的捕获10个数据包,回调函数很简单,只含有一个计数器,每捕到一个包,计数器就加1。