今天要讲解处理脱机dump文件(Handling offline files)。dump文件大家一定不会太陌生,其实就是进程的内存镜像。dump很大程度上是一个计算机术语,你应该会在跟备份有关的领域里听到这个词。而对于WinPcap的dump文件来说,其实就是将捕获到的所有网络数据包的信息存储到文件当中。事实上这是相当有意义的一件事情,用过捕包软件的同志,比如WireShark,将捕获到的信息保存至文件,还可以将文件中的信息载入到分析软件中,这样可以方便多次地查看和分析。WinPcap正是提供了相关的API来让开发者方便做这些事情,导出的格式也是和libpcap保持一致的,保持高度的移植性。
1、配置传入参数
测试代码:
#include "pcap.h" #include <QCoreApplication> #include <winsock2.h> #include <ws2tcpip.h> void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); pcap_if_t *alldevs; pcap_if_t *d; int i = 0; int inum; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; pcap_dumper_t *dumpfile; /* 检查程序输入参数 */ if (argc != 2) { printf("usage: %s filename", argv[0]); return -1; } /* 获取本地机器设备列表 */ if (pcap_findalldevs_ex((char *)PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1) { fprintf(stderr, "Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1); } /* 打印列表 */ for (d = alldevs; d; d = d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if (i == 0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return -1; } printf("Enter the interface number (1-%d):", i); scanf("%d", &inum); if (inum < 1 || inum > i) { printf("\nInterface number out of range.\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } /* 跳转到选中的适配器 */ for (d = alldevs, i = 0; i < inum - 1; d = d->next, i++) ; /* 打开设备 */ if ((adhandle = pcap_open( d->name, // 设备名 65535, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲池 )) == NULL) { fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } /* 打开堆文件 */ dumpfile = pcap_dump_open(adhandle, argv[1]); if (dumpfile == NULL) { fprintf(stderr, "\nError opening output file\n"); return -1; } printf("\nlistening on %s... Press Ctrl+C to stop...\n", d->description); /* 不再需要设备列表了,释放它 */ pcap_freealldevs(alldevs); /* 开始捕捉 */ pcap_loop(adhandle, 0, packet_handler, (u_char *)dumpfile); return a.exec(); } /* 回调函数,当收到每一个数据包时会被libpcap所调用 */ /* 回调函数,用来处理数据包 */ void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data) { /* 保存数据包到堆文件 */ pcap_dump(dumpfile, header, pkt_data); }
执行结果:
0.0分
0 人评分
最小公倍数 (C语言代码)浏览:898 |
1908题解浏览:680 |
1126题解浏览:649 |
DNA (C语言代码)浏览:441 |
2^k进制数 (C语言描述,蓝桥杯)浏览:1457 |
C二级辅导-分段函数 (C语言代码)浏览:659 |
C二级辅导-阶乘数列 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:587 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:1213 |
1250题解浏览:604 |