下面咱们再看看如何从dump文件中将数据读取出来,仍然是给出一个实例。
#include "pcap.h" #include <QCoreApplication> #include <winsock2.h> #include <ws2tcpip.h> void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *); int main(int argc, char *argv[]) { QCoreApplication a(argc, 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, // 设备名 65535, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲池 )) == NULL) { fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", source); /* 释放设备列表 */ return -1; } pcap_loop(fp, 0, dispatcher_handler, NULL); return a.exec(); } /* 回调函数,当收到每一个数据包时会被libpcap所调用 */ /* 回调函数,用来处理数据包 */ #define LINE_LEN 16 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 (%u)\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"); }
执行结果:
0.0分
0 人评分