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.2.2 测试内核统计与转储模式 - 图1

图 13-7 不支持内核统计与转储功能的测试结果

从结果可见,WinPcap并不能真正支持内核统计与转储功能。存在此问题的原因还是WinPcap驱动程序不支持内核转储(MODE_DUMP)功能。在上节修改过的WinPcap上运行测试程序,发现WinPcap真正支持了内核统计与转储功能。测试结果如图13-8所示,转储的文件内容如图13-9所示。

13.2.2 测试内核统计与转储模式 - 图2

图 13-8 支持内核统计与转储功能的测试结果

13.2.2 测试内核统计与转储模式 - 图3

图 13-9 内核转储文件(test.txt)的数据包分析(共87个)