libpcap捕包 CPU使用率高的问题
偶用libpcap捕包就是普通的捕包程序,程序节选如下所示:
//解析IP包的函数
void ip_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content)
{
.....................
}
//接收以太网包的函数,回调函数
void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content)
{
.............
switch (ethernet_type)
/* 根据以太网类型字段判断上层协议,然后调用相应函数进行分析 */
{
/* 上层是IP协议 */
case 0x0800:
ip_protocol_packet_callback(argument, packet_header, packet_content);
break;
/* 调用分析IP协议的函数 */
default:
break; /* 其它的协议在此没有分析,读者可以试着进一步分析 */
}
.............
}
void main()
{
pcap_t *pcap_handle;
/* libpap句柄 */
char error_content[PCAP_ERRBUF_SIZE];
/* 存储错误内容 */
char *net_interface;
/* 网络接口 */
struct bpf_program bpf_filter;
/* BPF过滤规则 */
char bpf_filter_string[] = "";
/* 过滤规则字符串,此时为空的,表示捕获所有的网络数据包,而不是捕获特定的网络数据包 */
bpf_u_int32 net_mask;
/* 网络掩码 */
bpf_u_int32 net_ip;
/* 网络地址 */
/* alarm(60);
signal(SIGALRM,alarm_func);*/
net_interface = pcap_lookupdev(error_content);
/* 获得网络接口 */
pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);
/* 获得网络地址和网络掩码 */
pcap_handle = pcap_open_live("eth1", BUFSIZ, 1, 0, error_content);
/* 打开网络接口 */
pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);
/* 编译过滤规则 */
pcap_setfilter(pcap_handle, &bpf_filter);
/* 设置过滤规则 */
if (pcap_datalink(pcap_handle) != DLT_EN10MB)
return ;
pcap_loop(pcap_handle, - 1, ethernet_protocol_packet_callback, NULL);
/* 注册回调函数,循环捕获网络数据包,然后调用回调函数对捕获的网络数据包进行分析 */
pcap_close(pcap_handle);
/* 关闭Libpcap操作 *
}
上面是一个反复捕包的过程,在抓一个局域网的情况下,CPU占用率很小,当我开了一个模拟攻击的程序后,尽管解析IP包的函数里面不做任何处理,就是抓来包就丢掉,CPU使用率就会高达100%。算了一下流量,流量也不算特别大。
还有一个问题就是,如果我在解析IP包的函数里面用fprintf输出接收到的包的IP地址信息,CPU使用率也会降下来。
这是为什么呢,望达人指点一二,不胜感激!