Libpcap库编程指南--保存数据包
来源:互联网 发布:淘宝网不能访问 编辑:程序博客网 时间:2024/05/20 07:51
#include "pcap.h"#include <cstdlib>/* 回调函数原型 */void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int main(int argc, char **argv){ pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; 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(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %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_live(d->name, // 设备名 65536, // 要捕捉的数据包的部分 // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 true, // 混杂模式 1000, // 读取超时时间 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, (unsigned char *)dumpfile); return 0;}/* 回调函数,用来处理数据包 */void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data){ /* 保存数据包到堆文件 */ pcap_dump(dumpfile, header, pkt_data);}
你可以看到,这个程序的结构和前面几讲的程序非常相似,它们的区别有:
只有当接口打开时,调用 pcap_dump_open() 才是有效的。 这个调用将打开一个堆文件,并将它关联到特定的接口上。
数据包将会通过 pcap_dump() 函数写入堆文件中,这个函数是packet_handler()的回调函数。 pcap_dump() 的参数和 pcap_handler() 函数中的参数是一一对应的。
阅读全文
0 0
- Libpcap库编程指南--保存数据包
- Libpcap库编程指南--数据包捕获
- Libpcap库编程指南--网卡数据包捕获
- Libpcap库编程指南--过滤数据包
- Libpcap库编程指南--分析数据包
- Libpcap库编程指南--网卡信息获取
- Libpcap库编程指南--网卡高级信息获取
- libpcap编程(2)DPDK下的数据包捕获
- libpcap接收数据包(三)
- libpcap接收数据包(三)
- libpcap接收数据包(三)
- 使用libpcap库过滤pcap文件中的数据包
- libpcap编程
- libpcap获取数据包函数详解
- libpcap获取数据包函数详解
- UNIX环境编程学习笔记----Libpcap库
- Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤
- libpcap捕获数据包储存于读取
- markdown编辑器
- JS数组扁平化、去重、排序
- activeMQ指南针_消息存储机制_Kaha存储机制原理分析
- linux内核代码特点
- 全文索引维护
- Libpcap库编程指南--保存数据包
- 堆、栈和队列的区别
- trs常见问题
- 使用SecureCRT写Spark-shell无法退格
- XListView无网络
- 网络编程
- 计蒜客-乌鲁木齐网络赛&费用流&拆点-Our Journey of Dalian Ends
- hibernate分组查询后,求分组总数的实现方法(管理系统分页)
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能