下面咱们再看看如何从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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复