高速的IP数据的接收存盘与分发,是系统设计的关键之一,我们采用github上开源的网络数据抓包库npcap,npcap是一个网络数据包抓包工具,是WinPcap的改进版;它支持NDIS 6技术。Npcap 项目是最初 2013 年由 Nmap 网络扫描器项目(创始人 Gordon Lyon)和北京大学罗杨博士发起,由 Google 公司的 Summer of Code 计划赞助的一个开源项目,遵循 MIT 协议。Npcap 基于 WinPcap 4.1.3 源码基础上开发,支持 32 位和 64 位架构,在 Windows Vista 以上版本的系统中,采用 NDIS 6 技术的 Npcap 能够比原有的 WinPcap 数据包(NDIS 5)获得更好的抓包性能,并且稳定性更好。源码下载地址https://github.com/nmap/npcap,下载后利用example里的UDPdump为基础进行修改:
npcap库的使用,请参考npcap的库文档说明,在此只列举修改的要点:
1)将packet_filter字符数组内容由原来的”ip and udp”修改为”ether proto x0909”,因为网络上有不同的IP协议包在发送,有些是已知的编码包,比如UDP,ARP,TCP...,我们只需要抓自制数据包信息,其他与我们通信无关的数据需要滤除掉,因此我们为自己的数据包在IP层定义了一个协议标识0x0909,此0x0909不属于任何已知的协议标识,是自定义的,当然你也可以定义为其他的。目的是保障抓取的数据只有自己需要的收发数据,为此需要在板卡的verilog语言实现的IP发送源码中修改配合(后续推文讲解)
2)为了提高此程序在Win10系统的运行优先级,加入以下语句:etPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);//HIGH_PRIORITY_CLASS,REALTIME_PRIORITY_CLASS
初始化过程中,打开流盘存储文件:
/* Open the dump file */
dumpfile = pcap_dump_open(adhandle, "scuzy.txt"); // argv[1]);
3)将kernal buf和app buf适当设置的较大一些,避免连续采集时因缓存不足而丢包,这个比较关键:
/* start the capture */
if (pcap_setbuff(adhandle, 1024*1024*64) != 0) { //zhiadd
fprintf(stderr, "\n kernal buff set err\n");
return -1;
}
if (pcap_setuserbuffer(adhandle, 1024 * 1024 * 128) != 0) {
fprintf(stderr, "\n app buff set err\n");
//return -1;
}
pcap_setmintocopy(adhandle, 1024*256);//default size value of 16000 bytes
pcap_setmintocopy是设置两个缓存区的每次数据copy量,太小会加大cpu的处理载荷
4)采用回调模式工作,抓包程序一致不停工作,每完成一次APP缓冲器的数据抓包,产生一次回调,在回调函数里实现高速存盘,只要前面几个缓存设置合适,实际连续抓包一个小时是没有丢包的,为啥不测试1天?测试时,我的数据采样率50M/s,14bits,每秒的数据量是2字节*50M*8bits=800Mbits/s,每秒100M字节,一分钟就是60s*100M=6Gbytes,一小时就是60*6G=360Gbytes,几乎塞满我现在的硬盘剩余空间了,后续准备在采样后用FPGA先压缩编码数据,再回传PC。最近忙于测试NI usrp平台,这部分压缩工作要先缓缓。
。。。。。。。
WinExec("readfile_socket.exe", SW_HIDE);
pcap_loop(adhandle, 0, packet_handler, (unsigned char*)dumpfile);
return 0;
}
/* Callback function invoked by libpcap for every incoming packet */
void packet_handler(u_char * dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
pcap_dump(dumpfile, header, pkt_data);
}
如上所述,在启动抓包存盘时,会启动readfile_socket.exe分发程序,该分发程序会同时打开存储流盘文件,采用TCP server协议,把实时采集的数据分发给局域网里的其他PC的处理显示程序。分发程序readfile_socket.exe后续推文再讲解。下图中的scuzy.txt是一分多钟的数据文件