libpcap也能夠從檔案(.pcap)讀取封包。
一開始一樣打開一個handle。
char errbuf[PCAP_ERRBUF_SIZE]; const char *filename = "saved.pcap"; pcap_t *handle = pcap_open_offline(filename, errbuf); if(!handle) { fprintf(stderr, "pcap_open_offline(): %s\n", errbuf); exit(1); }//end if printf("Open: %s\n", filename);
但是檔案已經是儲存好的資訊了,所以使用函數
pcap_open_offline()
打開一個離線handle;第一個參數是打開檔案的檔名,這邊用上一篇儲存好的封包來用。函數
pcap_open_offline()
原型:pcap_t *pcap_open_offline(const char *fname, char *errbuf);
- 返回值:成功傳回一個libpcap handle,失敗傳回NULL,錯誤訊息在errbuf。
- 參數:fname要打開的檔案路徑名稱。errbuf錯誤訊息。
- 功能:打開一個離線檔案的handle。
接下來的操作就跟一般操作handle一樣,可以使用抓封包的幾個函數來抓。
int total_amount = 0; int total_bytes = 0; while(1) { struct pcap_pkthdr *header = NULL; const u_char *content = NULL; int ret = pcap_next_ex(handle, &header, &content); if(ret == 1) { total_amount++; total_bytes += header->caplen; }//end if success else if(ret == 0) { printf("Timeout\n"); }//end if timeout else if(ret == -1) { fprintf(stderr, "pcap_next_ex(): %s\n", pcap_geterr(handle)); }//end if fail else if(ret == -2) { printf("No more packet from file\n"); break; }//end if read no more packet }//end while
這邊就直接計算這個檔案內有幾個封包、總共多少byte;函數
pcap_next_ex()
傳回-2的時候,表示已經讀完檔案了。最後就顯示幾個封包、多少byte。
//result printf("Read: %d, byte: %d bytes\n", total_amount, total_bytes);
程式結束前一樣要關掉這個handle。
//free pcap_close(handle);
編譯:
libpcap % gcc -I/usr/local/opt/libpcap/include -Wall -std=gnu99 -L/usr/local/opt/libpcap/lib -lpcap read-from-file.c -o read-from-file
執行結果(Mac OS X):
libpcap % ./read-from-file Open: saved.pcap No more packet from file Read: 1000, byte: 408112 bytes
執行結果(CentOS):
[root@tutu libpcap]# ./read-from-file Open: saved.pcap No more packet from file Read: 1000, byte: 130005 bytes
Source code on Github
沒有留言:
張貼留言