【VS开发】使用WinPcap编程(4)——把网络数据包存储到一个文件中

时间:2022-09-07 16:43:10

这里用到的数据结构是pcap_dumper_t,这也是一个相当于文件描述符的东西,我们在用的时候先指定pcap_dumper_t *dumpfp;

使用两个函数来存储网络数据,一个是pcap_dump_open(),另一个是pcap_dump()。先用前一个函数打开一个文件,然后用后一个函数把网络数据写到这个文件中。最后用pcap_dump_close()这个函数把这个文件关闭。

函数原型如下:

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

1、p是我们已经打开的网络设备,从这个设备接收数据包。

2、fname是我们要写入的文件名,随便起。

return: 如果出错,会返回NULL。可以借此检查这个文件有没有打开。

文件打开之后,就可以向文件之中写数据了。数据也是一个包一个包的写进去的,还要用到pcap_loop()这个函数。只不过这里的user要指定为打开文件的描述符dumpfp。在使用packet_handler 这个函数指针的时候,参数中的user就是这个dumpfp。pcap_dump()的原型如下:

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

1、这里的user就是文件描述符dumpfp,只不过要做一下类型转换。由于这个函数一般在pcap_loop()的函数指针所指向的packet_handler中使用,所以packet_handler中的user就是这里的user。

2、h是pkt_header。

3、sp这里要用pkt_data。具体参看下面的实例:

void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{
printf("in packet handler\n");
pcap_dump(NULL, pkt_header, pkt_data);
return;
}

附上一个源代码:

#define _CRT_SECURE_NO_WARNINGS

#include "pcap.h"

void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);

int main()
{
pcap_t *cap_ins_des;
pcap_if_t *alldevs;
pcap_if_t *d;
char source[PCAP_BUF_SIZE];
char errbuf[PCAP_ERRBUF_SIZE];
int i;
u_int netmask;
char packet_filter[] = "ip and udp"; // the filter
struct bpf_program fcode; // used in pcap_compile()
pcap_dumper_t *dumpfp; /* set the source */
if (pcap_createsrcstr(source, PCAP_SRC_IFLOCAL, NULL, NULL, NULL, errbuf) == -1) {
printf("%s\n", errbuf);
exit(-1);
}
printf("source: %s\n", source); /* find all devices */
if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1) {
printf("%s\n", errbuf);
exit(-1);
} /* choose one devices */
d = alldevs;
while (d != NULL) {
printf("%s, %s\n", d->name, d->description);
d = d->next;
}
scanf("%d", &i);
d = alldevs;
while (--i)
d = d->next;
printf("selected device: %s\n", d->name); /* open one device */
cap_ins_des = pcap_open(d->name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf);
if (cap_ins_des == NULL) {
printf("%s\n", errbuf);
pcap_freealldevs(alldevs);
exit(-1);
} /* get the netmask, used at compiling the filter */
if (d->addresses != NULL)
netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; /*@#$%^&*!*/
else
netmask = 0xffffff; /* 255.25.255.0 */ // netmask = 0; /* compile the filter */
if (pcap_compile(cap_ins_des, &fcode, packet_filter, 1, netmask) < 0) {
printf("Error\n");
pcap_freealldevs(alldevs);
exit(-1);
} /* set the filter */
if (pcap_setfilter(cap_ins_des, &fcode) < 0) {
printf("Error\n");
pcap_freealldevs(alldevs);
exit(-1);
} /* open a file to dump data */
dumpfp = pcap_dump_open(cap_ins_des, "traffic.data");
if( dumpfp == NULL) {
printf("Error on opening output file\n");
exit(-1);
} pcap_freealldevs(alldevs); /* start the capture */
pcap_loop(cap_ins_des, 30, packet_handler, (u_char *)dumpfp); pcap_dump_close(dumpfp); return 0;
} void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{
printf("in packet handler\n");
pcap_dump(NULL, pkt_header, pkt_data);
return;
}

main()函数中下面的十来行是把网络数据包存到一个文件中的方法。

【VS开发】使用WinPcap编程(4)——把网络数据包存储到一个文件中的更多相关文章

  1. 用C&plus;&plus;实现网络编程---抓取网络数据包的实现方法

    一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...

  2. 网络-数据包在路由转发过程中MAC地址和IP地址,变与不变

    关于MAC地址和IP地址在传输过程中变与不变的问题: 结论:MAC地址在同一个广播域传输过程中是不变的,在跨越广播域的时候会发生改变的:而IP地址在传输过程中是不会改变的(除NAT的时候),总结为 路 ...

  3. 捕获网络数据包并进行分析的开源库-WinPcap

    什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets.  这是一种简单的 ...

  4. UNIX网络编程——网络数据包检测

    网络数据包检测 数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成. 三种访问方式: BSD Packet Filter(BPF) SVR4 Datalink Provi ...

  5. iOS开发-UIWebView加载本地和网络数据

    UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档,关于浏览网页榜样可以参考UC,手机必备浏览器,至于文档浏览的手机很多图书阅读软件,UIWebView是一个混合体,具体的功能控件内置 ...

  6. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  7. sk&lowbar;buff封装和解封装网络数据包的过程详解(转载)

    http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  8. linux2&period;6&period;24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一

    在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...

  9. Android利用tcpdump和wireshark抓取网络数据包

    Android利用tcpdump和wireshark抓取网络数据包 主要介绍如何利用tcpdump抓取andorid手机上网络数据请求,利用Wireshark可以清晰的查看到网络请求的各个过程包括三次 ...

随机推荐

  1. Service实时向Activity传递数据案例

    转自 http://www.cnblogs.com/linjiqin/p/3147764.html 演示一个案例,需求如下:在Service组件中创建一个线程,该线程用来生产数值,每隔1秒数值自动加1 ...

  2. &num;import、&num;include以及&commat;class的区别

    一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话 ...

  3. C&num; 类型运算符重载在类继承中的调用测试

    这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest ...

  4. Javascript 中的false、0、null、undefined和空字符串对象

    在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象——false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来 ...

  5. Umbraco(5)-Creating Master Template Part 1(翻译文档)

    原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/umbraco5-creating-master-template-par ...

  6. Emit学习&lpar;1&rpar;-Emit概览

    一.Emit概述 Emit,可以称为发出或者产生.在Framework中,与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.可见Emit是作为反射的一个元素存在的. ...

  7. 转载:详解CSS选择器、优先级与匹配原

    转载网址:http://polaris1119.javaeye.com/blog/764428 文章就CSS选择器的优先级问题做了一些总结,严格来讲,选择器的种类可以分为三种:标签名选择器.类选择器和 ...

  8. 【干货】快速部署微软开源GPU管理利器&colon; OpenPAI

    [干货]快速部署微软开源GPU管理利器: OpenPAI 介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力.除此之外,还要压榨出硬件的所有潜力来加快模型训练.OpenPAI作为 ...

  9. C&num;关于TreeView树在节点数较多时总是会出现闪烁的问题方法记录

    首先介绍下背景吧,问题如题,这个问题应该说困扰我大半年了(不是说我没有请教大佬,不是说我没有上网查过,之前在搜索时,总是没有解决此问题~~),直到最近一次在在优化代码时,再次上网查找,在发现搜索词条” ...

  10. telnet不能用!!!提示:-bash&colon; telnet&colon; command not found

    1.[root@localhost ~]# telnet  2. 查询了是否安装Telnet包,结果如下:  telnet-server-0.17-47.el6.i686  [xinetd (pid ...