数据类型bpf_u_int32实际上就是u_int的一个别名,还有吧bpf_int32实际上就是int的别名。当然这个int是32位的,如果操作系统对int的定义不是4字节,bpf_int32就对应另外一种类型,总之,bpf_u_int32就是一个32位的无符号整型。

关键函数:
int pcap_lookupnet(const char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf)

用于获取网卡的网络号和子网掩码。其中device参数是网卡名,netp 和maskp表示将要获得的网络号和子网掩码,都是以网络字节序存放的,比如一个IP为10.108.20.0,那么netp中存放的这个地址就是:1338378。转换成二进制就是:
00000000 00010100 01101100 00001010
这个数在内存中的存在形式就是:
低地址----------------------------------------》高地址
00001010 01101100 00010100 00000000
对应每个字节的十进制就是:
10 108 20 0
网络字节序和主机字节序比较容易混乱(大端表示和小端表示)。
网络字节序采用大端表示,就是数据的高位要存放到低地址。
而大多数主机字节序采用小端表示(也有采用大端表示的主机字节序),就是数据的低位放到低地址。
比如无符号整型1338378,的二进制表示为:
数据的高位----------------------------》数据的低位
00000000 00010100 01101100 00001010
所以采用小端表示的主机字节序时,内存中存放的形式为:
低地址----------------------------------------》高地址
00001010 01101100 00010100 00000000
errbuf存放错误信息。失败返回-1
errbuf的大小可以定义为:PCAP_ERRBUF_SIZE

pcap_t *pcap_open_live(const char *device, int snaplen,int promisc, int to_ms, char *errbuf)

用于打开网络设备,返回一个pcap_t结构体的指针。
帮助文档中的说法是:用于获取一个数据包捕获的描述符,以便用来查看网络上的数据包。device是网卡名称。snaplen表示捕获的最大字节数,如果这个值小于被捕获的数据包的大小,则只显示前snaplen位(实验表明,后面为全是0),通常来讲数据包的大小不会超过65535。promisc表示是否开启混杂模式。 to_ms 表示读取的超时时间,毫秒为单位,就是说没有必要看到一个数据包这个函数就返回,而是设定一个返回时间,这个时间内可能会读取很多个数据包,然后一起返回。如果这个值为0,这个函数一直等待足够多的数据包到来。errbuf用于存储错误信息。

int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask)
用于编译字符串str成为一个过路程序,program参数是一个指向bpf_program结构体的指针,这个参数由函数pcap_compile()填充。optimize参数用于控制是否采用最优化的结果。netmask用于指定IPv4的网络子网掩码,这个参数仅仅在检查过滤程序中的IPv4广播地址时才会使用。

int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
用于指定一个过滤器程序,fp是一个指向bpf_program结构体的指针,通常是pcap_compile返回的结果。p通常是pcap_open_live()函数返回的结果。

int pcap_dispatch ( pcap_t * p, int cnt, pcap_handler callback, u_char * user );

这个函数用于收集和加工数据包。cnt指定用于加工的数据包的最大数量,超过了这个数量函数就会返回。当读取一个实时捕获的时候,一次仅有一个数据包的缓冲区被读取,所以处理的数据包的个数有可能少于cnt个。当cnt的值为-1时,会处理到达一个缓冲区的所有数据包,或者(如果不是实时捕获而是处理一个pcap文件)会处理文件中所有的数据包。 callback指定了一个回调函数。这个回调函数有三个参数:一个u_char类型的指针,这个参数是通过pcap_dispatch()函数传递的(应该是提供用户使用的), 一个指向pcap_pkthdr结构体常量的指针。这个结构体含有三个域,
struct pcap_pkthdr
{
struct timeval ts; ts是一个结构struct timeval,它有两个部分,第一部分是1900开始以来的秒数,第二部分是当前秒之后的毫秒数。表示数据包捕获的时间。
bpf_u_int32 caplen; 表示抓到的数据长度
bpf_u_int32 len; 表示数据包的实际长度
}
第二个域是一个u_char常量的指针,指向的一个数据包的前caplen个字节。

成功返回0,失败返回-1可以用pcap_perror来打印错误信息。
注意:当读取一个实时捕获时,当读取超时时pcap_dispatch()函数没有必要返回。

pcap_loop()函数和pcap_dispatch()用法相似。
int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user)
这个函数当读取超时时也不会返回。

void pcap_close ( pcap_t * p );
用于关闭pcap_open_live()获取的包捕捉句柄,释放相关资源。
一个典型的过程:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> #include <pcap.h> #include <arpa/inet.h>
#include <unistd.h>//getopt
#include <sys/types.h>//u_char void get_packet(u_char *user, const struct pcap_pkthdr *pkthdr, const u_char *packet)
{
// prase_packet(packet, pkthdr->len);
} int main(int argc,char* argv[])
{
char* device=NULL;
char ch;
//getopt()
//
if((ch = getopt(argc,argv,"d:"))==-)
{
printf("no options!!!\n");
exit();
}
optind=;
while ((ch = getopt(argc, argv, "d:")) != -)
{
switch (ch)
{
case 'd':
if(optarg!=NULL)
{
if( ( device = (char*)malloc(strlen(optarg) ) ) !=NULL)//remeber to free
{
strcpy(device,optarg);
//printf("%s\n",device);
}
else
{
printf("malloc error\n");
exit();
} }
else
{
exit();
} break; case '?':
default:
printf("Unknown option: %c\n",(char)optopt);
exit(); }
} //capture
if(!device)
{
printf("no device\n");
exit();
} char errBuf[PCAP_ERRBUF_SIZE]; //error Buff // struct pcap_pkthdr packet; The header that pcap gives us
pcap_t *phandle; //network interface bpf_u_int32 netp, maskp; //网络号和子网掩码
char *net, *mask;
struct bpf_program fcode;
struct in_addr addr;
//look up device network addr and mask
//获取网络参数 if(pcap_lookupnet(device, &netp, &maskp, errBuf)==-)
{
printf("get net failure\n");
exit();
} addr.s_addr = netp;
printf("%u\n",netp);
net = inet_ntoa(addr);
printf("network: %s\n", net); addr.s_addr = maskp;
mask = inet_ntoa(addr);
printf("mask: %s\n", mask); //open network device for packet capture
phandle = pcap_open_live(device, , , , errBuf);
if(NULL == phandle)
{
printf("open %s failure\n", device);
perror(errBuf);
exit();
}
char* filterString="ether src D8:5D:4C:36:76:83 or ether dst D8:5D:4C:36:76:83"; if(pcap_compile(phandle,&fcode,filterString,,maskp)==-)
{
fprintf(stderr,"pcap_compile: %s\n",pcap_geterr(phandle));
exit();
} if(pcap_setfilter(phandle,&fcode)==-)
{
fprintf(stderr,"pcap_setfilter: %s\n",pcap_geterr(phandle));
exit();
} pcap_loop(phandle, -, get_packet, NULL); //close device
pcap_close(phandle); return ;
}

如果您觉得对您有帮助,请点赞哦^^。

pcap简单使用和简单解释的更多相关文章

  1. ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...

  2. ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 路由 前两章节中,我们提到 ASP.NET Core 支持 MVC 开发 ...

  3. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  4. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  5. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  6. ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新增用户 上一章节我们实现了一个注册表单,但也留了一些东西还没完成, ...

  7. ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建 ...

  8. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 迁移数据 上一章节中我们配置了 ...

  9. ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...

  10. ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 验证特性 上一章节我们简单介绍了 ...

随机推荐

  1. 章文嵩博士和他背后的负载均衡(LOAD BANLANCER)帝国

    案首语: 阿里集团技术大牛,@正明,淘宝基础核心软件研发负责人.LVS创始人.阿里云首席科学家章文嵩博士从阿里离职,去追求技术人生另一段历程,让阿里像我一样的很多热爱技术的工程师都有一丝牵动和感触. ...

  2. Java面向接口编程【精品博客】

    我们从生活中去理解面向接口编程,以下举例四个案例来理解: 案例一(汽车案例): /** * 汽车标准接口 * @author Liudeli */ public interface ICar { /* ...

  3. 设计模式之状态模式(State Pattern)

    一.什么是状态模式? 把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象 也就是说,状态持有者(比如汽车,电视,ATM机都有多个状态)并不知道动作细节,状态持有者只关心自己当前所处的状态 ...

  4. asp.net—自定义轻量级ORM

    大型项目中ORM的使用已经是相当的频繁.目前.NET(C#)中比较流行的ORM框架也有很多,比如SqlSugar,Dapper,Entity Framework(EF)等. 相信很多有2年以上工作经验 ...

  5. C# 对象引擎,以路径形式访问对象属性(data.Product[1].Name)

    对象引擎,以路径形式访问对象属性,例data.Product[1].Name. 在做excel模板引擎的时候,为了能方便的调用对象属性,找了一些模板引擎,不是太大就是不太适用于excel, 因为exc ...

  6. 理解DDoS防护本质:基于资源较量和规则过滤的智能化系统

    本文由  网易云发布. 随着互联网生态逐渐形成,DDoS防护已经成为互联网企业的刚需要求,网易云安全(易盾)工程师根据DDoS的方方面面,全面总结DDoS的攻防对抗. 1.什么是DDoS DDoS全称 ...

  7. iOS推送功能极光推送的介绍与实现

    1.个人整理操作流程 2.官方使用说明流程 2018iOS极光推送完整流程 极光推送官网

  8. .Net后台获取客户端信息

    1.获取浏览器版本号 /// <summary> /// 获取浏览器版本号 /// </summary> /// <returns></returns> ...

  9. [JavaScript] 获取数组中相同元素的个数

    /** * 获取数组中相同元素的个数 * @param val 相同的元素 * @param arr 传入数组 */ function getSameNum(val,arr){ processArr ...

  10. class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

    <Java虚拟机原理图解>1.3.class文件中的访问标志.类索引.父类索引.接口索引集合 字节码总体结构: 访问标志(access_flags)能够表示什么? 访问标志(access_ ...