libpcap/read_packet_from_file.c

libpcap也能夠讀取從Wireshark儲存的封包。

Source Code

//
//  read_packet_from_file.c
//  功能:從檔案讀取封包。
//  Created by 聲華 陳 on 2016/01/05.
//

#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>

void pcap_callback(u_char *arg, const struct pcap_pkthdr *header, const u_char *content);

int main(int argc, const char * argv[]) {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle = NULL;

    handle = pcap_open_offline("./packet.pcap", errbuf);
    if(!handle) {
        fprintf(stderr, "pcap_open_offline: %s\n", errbuf);
        exit(1);
    }//end if

    //read from file
    if(-1 == pcap_loop(handle, -1, pcap_callback, NULL)) {
        fprintf(stderr, "pcap_loop: %s\n", pcap_geterr(handle));
    }//end if

    //free
    pcap_close(handle);

    return 0;
}

void pcap_callback(u_char *arg, const struct pcap_pkthdr *header, const u_char *content) {
    static int d = 0;
    printf("No. %d\n", ++d);
}

結果

libpcap % ./read_packet_from_file 
No. 1
No. 2
No. 3
No. 4
No. 5
...略

程式會讀取同一個目錄下的封包檔案packet.pcap

分析

    handle = pcap_open_offline("./packet.pcap", errbuf);
    if(!handle) {
        fprintf(stderr, "pcap_open_offline: %s\n", errbuf);
        exit(1);
    }//end if

這次改使用pcap_open_offline()來打開一個封包讀取, 封包檔名是程式目錄下的packet.pcap


    //read from file
    if(-1 == pcap_loop(handle, -1, pcap_callback, NULL)) {
        fprintf(stderr, "pcap_loop: %s\n", pcap_geterr(handle));
    }//end if

剩下的動作跟抓封包的時候一樣。


    //free
    pcap_close(handle);

記得一樣要釋放資源。

結語

libpcap不僅可以將封包儲存起來,也可以讀取出來做分析。

results matching ""

    No results matching ""