【VS开发】使用WinPcap编程(2)——打开网络设备并且开始捕获数据包
这里需要特别强调的一个数据结构是pcap_t,它相当于一个文件描述符,代表一个已经打开的设备。我们对这个设备进行操作,就是对这个文件描述符进行操作。
首先是打开一个已知的设备,使用pcap_open()这个函数,其原型如下:
pcap_t * pcap_open (const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf)
1、source是我们所要打开的设备。当我们获取所有的设备之后,这个source就是d->name。如果是文件的话,就是文件的名字,也是d->name。
2、snaplen是我们抓取的数据包的大小,100就是抓取整个数据包的前100bytes,65536最大,把整个包都包括了。不过有时候不管用(看设备)。
3、flags是设置网络设备打开的状态的,最重要的是PCAP_OPENFLAG_PROMISCUOUS,表示这个网络设备以混杂模式打开,可以捕捉局域网中所有数据包。
4、read_timeout是设置延迟时间(milliseconds)用的。捕捉数据包的时候,延迟一定的时间,然后再调用内核中的程序,这样效率较高。0表示没有延迟,没有包到达的时候永不返回。-1表示立即返回。
5、auth是远程机器的登录信息。本地机器则为NULL。
6、errbuf存储出错信息。
return: 返回这个打开设备的描述符,如果出错,返回NULL。
打开设备之后就要开始捕捉数据包了。pcap_loop()函数对捕捉到的数据包进行处理,每次处理一个数据包。其函数原型如下:
int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user)
1、p就是我们打开的某个网络设备的描述符。
2、cnt是count,表示这个循环会总共处理多少个数据包。比如30,就是处理30个数据包。0表示没有限定。
3、callback是一个函数指针,用来具体操作如何对数据包进行处理。
4、user是用户信息。我也不知道怎么用,一般为NULL。
下面说一下上面函数中的函数指针,用来具体操作处理数据包。其定义如下:
typedef void(* pcap_handler )(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
1、user就是pcap_loop()函数中的user,一般也没什么用,在函数内部都用(VOID)user; 进行标记。
2、pkt_header是捕捉到这个数据包时WinPcap添加的一些信息,有时间戳、捕捉到的包长度、实际包长度这些信息。参看这里。
3、pkt_data就是实际的数据包了,包括ethernet header, ip header, tcp header, real data等等各种不同的信息。
附上一个源代码:
#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; // descriptor of an opened capture instance
pcap_if_t *alldevs; // pcap_if_t is interface type
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE]; // store error information
int i;
//char source[PCAP_BUF_SIZE]; /* find all useful devices in my local host */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) {
printf("%s\n", errbuf);
exit(-1);
} /* choose one interface */
d = alldevs;
while (d != NULL) {
printf("%s\n", d->description == NULL ? NULL : d->description);
d = d->next;
}
d = alldevs;
scanf("%d", &i);
while (i--)
d = d->next; /* open this interface */
cap_ins_des = pcap_open(d->name /* char *source */, 100, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf);
if (cap_ins_des == NULL) {
printf("%s\n", errbuf);
exit(-1);
} /* free all the devices, because we don't use them any more */
pcap_freealldevs(alldevs); /* start the capture, deal with one packet each loop */
pcap_loop(cap_ins_des, 30 /* capture 30 packets */, packet_handler, NULL); return 0;
} void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{
time_t time = pkt_header->ts.tv_sec;
struct tm *ltime = localtime(&time);
char timestr[16]; (VOID)user;
(VOID)pkt_data; strftime(timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s. %d, %d, %d\n", timestr, pkt_header->ts.tv_usec, pkt_header->caplen, pkt_header->len);
}
【VS开发】使用WinPcap编程(2)——打开网络设备并且开始捕获数据包的更多相关文章
- Winpcap笔记4之不用回调函数捕获数据包
函数1: pcap_next_ex(pcap_t* p, struct pcap_pkthdr** pkt_header, const u_char* ...
- winPcap编程之打开适配器并捕获数据包(四 转)
在贴源码之前先介绍一个将要用到的很重要的函数--pcap_open(),下面是pcap_open()在remote-ex.h中的声明: pcap_t *pcap_open(const char *so ...
- winPcap编程之不用回调方法捕获数据包(五 转)
这一次要分析的实例程序跟上一讲非常类似(“打开适配器并捕获数据包”),略微不同的一点是本次将pcap_loop()函数替换成了pcap_next_ex()函数.本节的重点也就是说一下这两个函数之间的差 ...
- Winpcap笔记3之打开适配器并捕获数据包
上一讲中知道了如何获取适配的信息,这一将我们讲写一个程序蒋每一个通过适配器的数据包打印出来. 打开设备的函数是pcap_open().函数原型是 pcap_t* pcap_open(const cha ...
- winpcap使用之捕获数据包
第一种方法,调用回调函数 #include "pcap.h" /* packet handler 函数原型 */ void packet_handler(u_char *param ...
- winPcap_5_打开适配器并捕获数据包
知道如何获取适配器的信息了,那我们就开始一项更具意义的工作,打开适配器并捕获数据包.编写一个程序,将每一个通过适配器的数据包打印出来. 打开设备的函数是 pcap_open(). (Open a ge ...
- C#开发BIMFACE系列48 Nginx部署并加载离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列47 IIS部署并加载离线数据包>中详细介绍了IIS部署并访问的完整步 ...
- C#开发BIMFACE系列47 IIS部署并加载离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前两篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>与<C#开发BIMFACE系 ...
- C#开发BIMFACE系列45 服务端API之创建离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] BIMFACE的常规应用方式有公有云与私有化部署两种方式,并且浏览模型或者图纸需要使用ViewToken,ViewToke ...
随机推荐
- 前端面试题-CSS Hack
一.CSS Hack的概念 由于不同厂商的流览器或某浏览器的不同版本(如IE,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中呈现出不一 ...
- 2017 CVTE Windows开发二面 3.8 (offer)
中午1点左右,广州的号码打过来了,是CVTE的hr,然后问我下午4点半有没有时间,帮我约视频的二面. 当然有时间了啦,然后hr给我邮箱发了个链接,让我4点半登陆进去. 因为1面没问任何网络和操作系统的 ...
- 自定义 Swiper 的上一页,下一页按钮
1. Swiper 的上一页,下一页按钮,不是必需包含在container 中的 2. 定义上一页,下一页按钮的样式,CSS略.... 3. 在初始化Swiper中,定义上一页,下一页按钮
- css3之3D 旋转立方体与哆啦A梦
主要记录两个css3 3D转换的示例 ㈠哆啦A梦 三个哆啦A梦的图片,分别让其围绕X轴,Y轴,Z轴旋转60度,鼠标放上开始发生变化. 具体代码如下图所示: <!DOCTYPE html> ...
- Struts2笔记(学struts2只需要这一篇文章)
1.如何将struts2框架引入到web项目中 1.把struts2相关jar包引入到项目中 2.把struts2的配置文件直接放到src下面,名字要叫做struts.xml.(运行时配置文 ...
- reactjs 的 css 模块化工具 styled-components 升级后 createGlobalStyle 废除,使用 createGlobalStyle 的方案
在 styled-components 升级到 4 版本后设置全局属性的 createGlobalStyle 这个 api 被废除,替代的 api 是 createGlobalStyle 与过去组织代 ...
- 【Python】学习笔记一:Hello world
前言 在我看来,无论我们学习什么语言第一个学习的估计都是Hello world,那么接下来就从Hello world说起! 编写代码 我在本机上已经安装了pycharm,所以我所编辑的代码都是在pyc ...
- windows管理员权限激活
第一步:计算机-右键--管理--选择用户,选择administrator用户--取消勾选:账户禁用 第二步:alt+ctrl+delete,快捷键调出资源管理器--点击切换用户 第三步:显示出现adm ...
- 01.二维数组中的查找 (Java)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- Ruby Programming学习笔记
#将ARGV[0]转换成正则表达式类型 pattern= Regexp.new(ARGV[0]) #Devise gem包 Devise是Ruby中使用最广泛的身份验证gem包之一.Devise为我们 ...