这里我们将捕获到的数据包保存到堆文件里。堆文件的格式是libpcap的一种。这种格式中,包含了被捕捉到的包的二进制数据,并且,这种格式是许多网络工具所使用的一种标准,这些工具包括WinDump,Etheral和Snort。堆文件组织的含义是说:一条记录可以放在文件中的任何地方,只要那个地方有空间存放这条记录。在这种记录组织方式中,记录是没有顺序的,是堆积起来的。

WinPcap提供了很多函数保存和读取堆文件。下面介绍两个函数。

1、pcap_dump_open()函数

pcap_dump_open()函数打开一个可以保存数据的文件。具体格式如下:

pcap_dumper_t* pcap_dump_open  ( pcap_t *  p,  const char *  fname   ); 

参数含义:

p:一个libpcap存储文件的描述符,对用户不可见;

fname:要写入的文件名;

只有当接口打开时,调用 pcap_dump_open() 才是有效的。 这个调用将打开一个堆文件,并将它关联到特定的接口上。

2、pcap_dump()函数

pcap_dump()函数将数据包写入用户指定的文件中。具体格式如下:

void pcap_dump  ( u_char *  user,  const struct pcap_pkthdr *  h,  const u_char *  sp   ); 

数据包将会通过 pcap_dump() 函数写入堆文件中,这个函数是packet_handler()的回调函数。 pcap_dump() 的参数和 pcap_handler() 函数中的参数是一一对应的。

下面的程序从一个选定的接口捕获数据包,并将数据包保存在指定的文件中:

#include "pcap.h"/* 回调函数原型 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);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_ex(PCAP_SRC_IF_STRING, NULL, &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);elseprintf(" (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,          // 设备名65536,            // 要捕捉的数据包的部分 // 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, (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);
}

结果如下:

保存的文件如下:

WinPcap笔记(9):保存数据包到堆文件相关推荐

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

    上一讲将数据包保存在堆文件中,现在,我们就可以读取它了.可以通过pcap_open_offline()函数将堆文件打开.函数具体格式如下: pcap_t* pcap_open_offline ( co ...

  2. ARP原理概述——基于WinPcap发送ARP请求数据包获取远程MAC地址

    ARP原理概述--基于WinPcap发送ARP请求数据包获取远程MAC地址 ARP协议 ARP概述 ARP工作原理 ARP数据包格式 编写程序发送ARP请求获取本机和远程IP的MAC 注意: ARP协 ...

  3. 网络学习笔记----01--pathping跟踪数据包路径

    操作系统win7 Pathping主要用于提供有关在来源和目标之间的中间跃点处的网络滞后和网络丢失的信息. Pathping将多个回显请求消息发送到来源和目标之间的各个路由器一段时间,然后根据各个路由 ...

  4. SX1276/77/78学习笔记5 - sx1278数据包结构

    SX1278 -数据包结构 LoRa™ 调制解调器采用隐式和显式两种数据包格式.其中,显式数据包的报头较短,主要包含字节数.编码率及是否在数据包中使用循环冗余 (CRC)等信息,数据包格式见下图. L ...

  5. VC++初步实现保存数据为音频WAV文件

    先行基本知识见此 https://blog.csdn.net/bcbobo21cn/article/details/109087252 win7, vc6:新建一个对话框工程:添加一个文本框:为文本框 ...

  6. python提取数据包中的文件_Python-对Pcap文件进行处理,获取指定TCP流

    通过对TCP/IP协议的学习,本人写了一个可以实现对PCAP文件中的IPV4下的TCP流提取,以及提取指定的TCP流,鉴于为了学习,没有采用第三方包解析pcap,而是对bytes流进行解析,其核心思想 ...

  7. linux防火墙为空文件夹,如何记录Linux IPTables防火墙丢弃的数据包到日志文件-linux防火墙设置...

    如果您的IPTables规则无法正常工作,则可能需要记录IPTables丢弃的数据包以进行故障排除.本文解释如何记录传入和传出丢弃的firewal数据包. 记录所有丢弃的输入数据包 首先,我们需要了解 ...

  8. 安卓游戏服务器文件是哪个文件夹,安卓手机游戏数据包放在哪个文件夹

    数据包路径一般为sdcard\ANDRIOD\data\某游戏数据包(com.游戏英文名称就是那个游戏的数据包). 安卓4.0及以上的话就是在内置存储中,也即文件管里中的sdcard目录(外置存储卡叫 ...

  9. tcpdump保存数据包

    1.启动tcpdump tcpdump 2.查看网卡 tcpdump -D 3. 抓取报文后隔指定的时间保存一次 tcpdump -i eth3 -s0 -G 60 -Z root -w %Y_%m% ...

最新文章

  1. 【学习笔记】人类为什么最终选择了芯片
  2. 《Java 核心技术卷1 第10版》学习笔记------异常
  3. g4e基础篇#1 为什么要使用版本控制系统
  4. scm maven_在运行时访问工件的Maven和SCM版本
  5. OSPF综合实验(有点难哦!)
  6. 疯狂java讲义第八章课后习题答案
  7. RFID定位技术下的智能养老系统具有哪些优势呢?--新导智能
  8. 基于stm32f401的双按键可视化多模式选择模块
  9. ubuntu CA安装 证书申请
  10. 模拟电子电路(1)——概论
  11. 网站被黑的10大原因
  12. 数学建模论文、代码降重小技巧
  13. 基于Highcharts的仪表盘设计
  14. 哈哈日语 日语五十音图之ら、わ行
  15. nginx 安装,配置
  16. 西电杨宗凯调研计算机学院,西安电子科技大学校长杨宗凯到网络与继续教育学院调研指导工作...
  17. 2021 搜狐畅游数据分析笔试题解析
  18. 借用smtp.qq.com发邮件
  19. Android通过OpenSL ES播放音频套路详解
  20. macOS获取文件绝对路径的快捷键

热门文章

  1. 360浏览器兼容问题
  2. 【文摘】 雪念——作者:蓝色妖姬
  3. css 控制溢出文本显示省略号效果
  4. 鸿蒙3部曲先看哪部,讨论雪鹰与鸿蒙三部曲的关系
  5. automake linux,Linux下automake软件编译与发布快速入门
  6. vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解
  7. 天津科技大学计算机学院复试分数线,2021天津科技大学研究生复试分数线
  8. python基本运算符_06-Python基础知识学习---基本运算符
  9. CSDN挑战编程——《绝对值最小》
  10. 格式化linux grub,linux grub 引导启动过程详解