高速的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是一分多鐘的數據文件
