13.2.2 测试内核统计与转储模式
测试WinPcap内核统计与转储模式的实例程序如下,完整的代码见[ch13/kdumpstat工程]。
defne WIN32
defne HAVE_REMOTE
include<stdlib.h>
include<stdio.h>
include<pcap.h>
include<Win32-Extensions.h>
//转储模式
defne MODE_DUMP 0x10
//内核统计与转储模式
defne MODE_STAT_DUMP MODE_DUMP|MODE_STAT
/回调函数/
void dispatcher_handler(u_char*,
const struct pcap_pkthdr,const u_char);
int main(int argc,char**argv)
{
pcap_if_talldevs,d;
pcap_t*fp;
u_int inum,i=0;
char errbuf[PCAP_ERRBUF_SIZE];
int ret=-1;
struct timeval st_ts;
printf("kdumpstat:using WinPcap kernel-level dump
and Statistical faeature.\n");
printf("\t Usage:%s dump_fle_name max_size max_packs\n",argv[0]);
if(argc!=4)
{//输入参数错误
exit(1);
}
……
/打开本机一个合适的网络设备,作为输出的网络适配器/
……
/开始内核文件转储/
if(pcap_live_dump(fp,argv[1],atoi(argv[2]),atoi(argv[3]))==-1)
{
//失败,返回
return-1;
}
/设置为内核统计与转储模式/
if(pcap_setmode(fp,MODE_STAT|MODE_DUMP)<0)
{//失败,返回
return-1;
}
/定时获得统计信息/
pcap_loop(fp,0,dispatcher_handler,(PUCHAR)fp);
/等待直到内核转储文件结束/
while(ret=pcap_live_dump_ended(fp,TRUE)==0)
{
if(ret==1)
{
printf("Dump is end.\n",ret);
break;
}
}
/关闭适配器/
pcap_close(fp);
return 0;
}
void dispatcher_handler(u_char*param,
const struct pcap_pkthdrheader,const u_charpkt_data)
{
//统计期间所接收数据包的字节总数
LARGE_INTEGER BytesAccepted;
//统计期间所接收数据包的包数
LARGE_INTEGER PacketsAccepted;
//内核转储文件的写入偏移量,也就是存储了多少个字节的内容
LARGE_INTEGER DumpOffset;
pcap_tfp=(pcap_t)param;
/获得系统时间,并显示到屏幕/
char timestr[16];
time_t stm;
time(&stm);
struct tm*ltime=localtime(&stm);
strftime(timestr,sizeof timestr,"%H:%M:%S",ltime);
printf("%s",timestr);
/打印内核返回统计信息的长度/
printf("len=%d,caplen=%d\n",header->len,header->caplen);
/获得各统计量,并显示到屏幕/
BytesAccepted.QuadPart=((LONGLONG)(pkt_data+8));
PacketsAccepted.QuadPart=((LONGLONG)(pkt_data));
printf("Bytes Accepted=%I64u",BytesAccepted.QuadPart);
printf("Packets AcceptedS=%I64u",PacketsAccepted.QuadPart);
if(header->len==24)
{//内核统计与转储模式才返回内核转储文件的写入偏移量
DumpOffset.QuadPart=((LONGLONG)(pkt_data+16));
printf("Offset=%I64u\n",DumpOffset.QuadPart);
if(DumpOffset.QuadPart>5000)
pcap_breakloop(fp);
}
else
{
printf("\n");
}
}
在WinPcap最新版本(WpcapSrc_4_1_2.zip)上运行测试程序的结果如图13-7所示。
图 13-7 不支持内核统计与转储功能的测试结果
从结果可见,WinPcap并不能真正支持内核统计与转储功能。存在此问题的原因还是WinPcap驱动程序不支持内核转储(MODE_DUMP)功能。在上节修改过的WinPcap上运行测试程序,发现WinPcap真正支持了内核统计与转储功能。测试结果如图13-8所示,转储的文件内容如图13-9所示。
图 13-8 支持内核统计与转储功能的测试结果
图 13-9 内核转储文件(test.txt)的数据包分析(共87个)