设置过滤器要用到两个函数,一个是pcap_compile(),另一个是pcao_setfilter()。他们的函数原型如下所示:

int pcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)

1、p是一个打开的网络设备的描述符。

2、fp是一个指针,用来存储一个编译好的过滤码。我们需要提前设置 struct bpf_program fcode 在这里使用。

3、str是字符串(以\0结尾),它指定一个字符串性质的过滤描述,通过这个函数把这个描述转换成可供内部使用的过滤码。

4、optimize设置是否要进行优化。一般为1。

5、netmask就是我们所打开的设备的netmask,不知道这个怎么用。一般用d->addresses->netmask这个就可以了。

return: 如果出错的话,就会返回一个小于0的值。

然后就是设置这个过滤器:

int pcap_setfilter (pcap_t *p, struct bpf_program *fp)

1、p就是一个已经打开的设备的描述符。

2、fp是用上面的函数编译好的过滤码,现在把这个过滤码设置到系统中去。

附上一个代码:

#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() /* 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);
} pcap_freealldevs(alldevs); /* start the capture */
pcap_loop(cap_ins_des, 30, packet_handler, NULL); return 0;
} void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{
printf("in packet handler\n");
return;
}

【VS开发】使用WinPcap编程(3)——设置过滤器的更多相关文章

  1. winpcap编程设置过滤器之指定获取某个网站的数据

    下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据. 游戏图: 我是乱世隋唐的网址是:www.917st.com 这个是官网网址的服务器地址.  42.62.0.14 我玩的游戏服是84区.网 ...

  2. Windows内核开发-3-内核编程基础

    Windows内核开发-3-内核编程基础 这里会深入讲解kernel内核的API.结构体.和一些定义.考察代码在内核驱动中运行的机制.最后把所有知识合在一起写一个有用的驱动. 本章学习要点: 1:通用 ...

  3. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  4. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  5. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  6. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  7. iOS开发之网络编程--使用NSURLConnection实现大文件下载

    主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...

  8. WinPcap编程入门实践

    转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...

  9. WinPcap编程(三)

    1.过滤器设置 设置过滤器,得到你想要的哪种类型的包.Like WireShark. 过程:编译过滤器,然后设置过滤器.直接上参考文档的代码: if (d->addresses != NULL) ...

随机推荐

  1. 兼容系列-IE678的兼容

    1. 最简单的CSS Hack 区分 IE6 . IE7 .IE8 css .color{ background-color: #CC00FF; /*所有浏览器都会显示为紫色*/ background ...

  2. linux学习:【第3篇】之常见命令2

    一.知识点回顾 临时:关闭当前正在运行的 /etc/init.d/iptables stop 永久:关闭开机自启动 chkonfig iptables off ll /var/log/secure # ...

  3. springMVC中使用 JSR-303验证器( Validation 接口 )

    在pom.xml,添加validator验证器的依赖 <dependency> <groupId>org.hibernate</groupId> <artif ...

  4. Acwing-96-奇怪的汉诺塔(递推)

    链接: https://www.acwing.com/problem/content/description/98/ 题意: 汉诺塔问题,条件如下: 1.这里有A.B.C和D四座塔. 2.这里有n个圆 ...

  5. zrender-粒子动画

    效果: let x = shuN.style.x + rectValue/4,//粒子开始的地方 y = zuY+140 + 5, h = 14*0.8, w = rectValue/2; this. ...

  6. dockerfile:python-cuda-nvidia-cudnn

    centos7 FROM centos:7 MAINTAINER yon@DataExa.com RUN yum -y install make wget \ && wget -O / ...

  7. vs 2019 调试web项目 浏览器

  8. JIRA7.13版本创建项目:问题类型管理(一)

    1.1 创建项目 一个项目是对一系列相关问题的综合管理.在Jira 中,可以通过以下方式创建项目.首先,需要具有项目创建权限的人登录后台管理界面,然后选择项目,通过创建项目按钮进入到项目创建的界面. ...

  9. The 10 Statistical Techniques Data Scientists Need to Master

    原文 就我个人所知有太多的软件工程师尝试转行到数据科学家而盲目地使用机器学习框架来处理数据,例如,TensorFlow或者Apache Spark,但是对于这些框架背后的统计理论没有完全的理解.所以提 ...

  10. springboot 项目中在普通类中调用dao层的mapper 出现空指针异常

    项目中我遇到同样的问题 特记载一下 有两种方式 一. 该类使用@Component注解 添加一个本类类型的静态字段 创建一个初始化方法,贴上@PostConstruct 标签,用于注入bean 创建方 ...