當(dāng)前位置:
首頁 >
WinPcap笔记(10):从堆文件中读取数据包
發(fā)布時(shí)間:2023/11/30
65
豆豆
生活随笔
收集整理的這篇文章主要介紹了
WinPcap笔记(10):从堆文件中读取数据包
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
上一講將數(shù)據(jù)包保存在堆文件中,現(xiàn)在,我們就可以讀取它了。可以通過pcap_open_offline()函數(shù)將堆文件打開。函數(shù)具體格式如下:
pcap_t* pcap_open_offline ( const char * fname, char * errbuf );
結(jié)果如下:
pcap_t* pcap_open_offline ( const char * fname, char * errbuf );
參數(shù)含義:
fname:要打開的文件名;
errbuf:保存錯(cuò)誤信息;
這里我們通過pcap_createsrcstr()函數(shù)根據(jù)新WinPcap語法創(chuàng)建一個(gè)源字符串。函數(shù)具體格式如下:
int pcap_createsrcstr ( char * source, int type, const char * host, const char * port, const char * name, char * errbuf );
參數(shù)含義:
source:要存入的源字符串;
type:要?jiǎng)?chuàng)建的源字符串類型;
host:遠(yuǎn)程主機(jī);
port:遠(yuǎn)程端口;
name:我們要打開的文件名;
errbuf:存儲(chǔ)錯(cuò)誤信息;
返回值:
0:沒有錯(cuò)誤;
-1:創(chuàng)建出錯(cuò),錯(cuò)誤寫入errbuf中;
下面的程序讀取保存的文件,然后將數(shù)據(jù)包中的數(shù)據(jù)打印出來:
#include <stdio.h> #include <pcap.h>#define LINE_LEN 16void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *);main(int argc, char **argv) {pcap_t *fp;char errbuf[PCAP_ERRBUF_SIZE];char source[PCAP_BUF_SIZE];if (argc != 2) {printf("usage: %s filename", argv[0]);return -1;}/* 根據(jù)新WinPcap語法創(chuàng)建一個(gè)源字符串 */if (pcap_createsrcstr(source, // 源字符串PCAP_SRC_FILE, // 我們要打開的文件NULL, // 遠(yuǎn)程主機(jī)NULL, // 遠(yuǎn)程主機(jī)端口argv[1], // 我們要打開的文件名errbuf // 錯(cuò)誤緩沖區(qū)) != 0){fprintf(stderr, "\nError creating a source string\n");return -1;}/* 打開捕獲文件 */if ((fp = pcap_open(source, // 設(shè)備名65536, // 要捕捉的數(shù)據(jù)包的部分// 65535保證能捕獲到不同數(shù)據(jù)鏈路層上的每個(gè)數(shù)據(jù)包的全部內(nèi)容PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式1000, // 讀取超時(shí)時(shí)間NULL, // 遠(yuǎn)程機(jī)器驗(yàn)證errbuf // 錯(cuò)誤緩沖池)) == NULL){fprintf(stderr, "\nUnable to open the file %s.\n", source);return -1;}// 讀取并解析數(shù)據(jù)包,直到EOF為真pcap_loop(fp, 0, dispatcher_handler, NULL);return 0; }void dispatcher_handler(u_char *temp1,const struct pcap_pkthdr *header, const u_char *pkt_data) {u_int i = 0;/* 打印pkt時(shí)間戳和pkt長度 */printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);/* 打印數(shù)據(jù)包 */for (i = 1; (i < header->caplen + 1); i++){printf("%.2x ", pkt_data[i - 1]);if ((i % LINE_LEN) == 0) printf("\n");}printf("\n\n");}
下面的程序同樣實(shí)現(xiàn)了如上功能,只是,我們使用了 pcap_next_ex() 函數(shù)來代替需要進(jìn)行回調(diào)的 pcap_loop() :
結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的WinPcap笔记(10):从堆文件中读取数据包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空镜子剧情介绍
- 下一篇: 文件描述符与打开文件的关系