2016年11月7日 星期一

libpcap - Read frames from file(7)


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

沒有留言:

張貼留言