日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinPcap笔记(10):从堆文件中读取数据包

發布時間:2023/11/30 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinPcap笔记(10):从堆文件中读取数据包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一講將數據包保存在堆文件中,現在,我們就可以讀取它了??梢酝ㄟ^pcap_open_offline()函數將堆文件打開。函數具體格式如下:

pcap_t* pcap_open_offline ( const char * fname, char * errbuf );

參數含義:

fname:要打開的文件名;

errbuf:保存錯誤信息;

這里我們通過pcap_createsrcstr()函數根據新WinPcap語法創建一個源字符串。函數具體格式如下:

int pcap_createsrcstr ( char * source, int type, const char * host, const char * port, const char * name, char * errbuf );


參數含義:

source:要存入的源字符串;

type:要創建的源字符串類型;

host:遠程主機;

port:遠程端口;

name:我們要打開的文件名;

errbuf:存儲錯誤信息;

返回值:
0:沒有錯誤;

-1:創建出錯,錯誤寫入errbuf中;

下面的程序讀取保存的文件,然后將數據包中的數據打印出來:

#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;}/* 根據新WinPcap語法創建一個源字符串 */if (pcap_createsrcstr(source, // 源字符串PCAP_SRC_FILE, // 我們要打開的文件NULL, // 遠程主機NULL, // 遠程主機端口argv[1], // 我們要打開的文件名errbuf // 錯誤緩沖區) != 0){fprintf(stderr, "\nError creating a source string\n");return -1;}/* 打開捕獲文件 */if ((fp = pcap_open(source, // 設備名65536, // 要捕捉的數據包的部分// 65535保證能捕獲到不同數據鏈路層上的每個數據包的全部內容PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式1000, // 讀取超時時間NULL, // 遠程機器驗證errbuf // 錯誤緩沖池)) == NULL){fprintf(stderr, "\nUnable to open the file %s.\n", source);return -1;}// 讀取并解析數據包,直到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時間戳和pkt長度 */printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);/* 打印數據包 */for (i = 1; (i < header->caplen + 1); i++){printf("%.2x ", pkt_data[i - 1]);if ((i % LINE_LEN) == 0) printf("\n");}printf("\n\n");}


下面的程序同樣實現了如上功能,只是,我們使用了 pcap_next_ex() 函數來代替需要進行回調的 pcap_loop() :

#include <stdio.h> #include <pcap.h>#define LINE_LEN 16main(int argc, char **argv) { pcap_t *fp; char errbuf[PCAP_ERRBUF_SIZE]; char source[PCAP_BUF_SIZE]; struct pcap_pkthdr *header; const u_char *pkt_data; u_int i=0; int res;if(argc != 2){printf("usage: %s filename", argv[0]);return -1;}/* 根據新WinPcap語法創建一個源字符串 */if ( pcap_createsrcstr( source, // 源字符串PCAP_SRC_FILE, // 我們要打開的文件NULL, // 遠程主機NULL, // 遠程主機端口argv[1], // 我們要打開的文件名errbuf // 錯誤緩沖區) != 0){fprintf(stderr,"\nError creating a source string\n");return -1;}/* 打開捕獲文件 */if ( (fp= pcap_open(source, // 設備名65536, // 要捕捉的數據包的部分// 65535保證能捕獲到不同數據鏈路層上的每個數據包的全部內容PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式1000, // 讀取超時時間NULL, // 遠程機器驗證errbuf // 錯誤緩沖池) ) == NULL){fprintf(stderr,"\nUnable to open the file %s.\n", source);return -1;}/* 從文件獲取數據包 */while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0){/* 打印pkt時間戳和pkt長度 */printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len); /* 打印數據包 */for (i=1; (i < header->caplen + 1 ) ; i++){printf("%.2x ", pkt_data[i-1]);if ( (i % LINE_LEN) == 0) printf("\n");}printf("\n\n"); }if (res == -1){printf("Error reading the packets: %s\n", pcap_geterr(fp));}return 0; }
結果如下:

總結

以上是生活随笔為你收集整理的WinPcap笔记(10):从堆文件中读取数据包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。