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不僅可以將封包儲存起來,也可以讀取出來做分析。