博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用libpcap抓包(一)----------libpcap基本使用
阅读量:4126 次
发布时间:2019-05-25

本文共 1649 字,大约阅读时间需要 5 分钟。

libpcap安装

先安装flex,bison

yum -y install flexyum -y install bison

下载libpcap源码并解压,再输入如下命令

./configuremakemake install

libpcap常用函数

int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);

查找所有可用的网络设备,若没有找到则返回-1

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

打开某个特定网络接口

第一个参数是第一步获取的网络接口字符串,可以直接使用硬编码。
第二个参数对于每个数据包,从开头要抓多少个字节,我们可以设置这个值来只抓每个数据包的头部,而不关心具体的内容。典型的以太网帧长度是1518字节,但其他的某些协议的数据包会更长一点,但任何一个协议的一个数据包长度都必然小于65535个字节。
第三个参数指定是否打开混杂模式(Promiscuous Mode),0表示非混杂模式,任何其他值表示混合模式。
第四个参数指定需要等待的毫秒数,超过这个数值后,第3步获取数据包的这几个函数就会立即返回。0表示一直等待直到有数据包到来。
第五个参数是存放出错信息的数组。

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

获取数据包

第一个参数是之前打开网络接口时返回的pcap_t类型的指针
第二个参数是需要抓的数据包的个数,一旦抓到了cnt个数据包,pcap_loop立即返回。负数的cnt表示pcap_loop永远循环抓包,直到出现错误。
第三个参数是一个回调函数指针,它必须是如下的形式:

void callback(u_char * userarg, const struct pcap_pkthdr * pkthdr, const u_char * packet)

第一个参数是pcap_loop的最后一个参数,当收到足够数量的包后pcap_loop会调用callback回调函数,同时将pcap_loop()的user参数传递给它

第二个参数是收到的数据包的pcap_pkthdr类型的指针
第三个参数是收到的数据包数据

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

设置过滤条件

fp:这是一个传出参数,存放编译后的bpf
str:过滤表达式
optimize:是否需要优化过滤表达式
netmask:可通过pcap_lookupnet函数获得

int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp,char *errbuf  );

获取指定网卡的ip地址,子网掩码

device:网络设备名,为第一步获取的网络接口字符串(pcap_lookupdev() 的返回值 ),也可人为指定,如“eth0”。
netp:存放 ip 地址的指针,bpf_u_int32 为 32 位无符号整型
maskp:存放子网掩码的指针,bpf_u_int32 为 32 位无符号整型
errbuf:存放出错信息

void pcap_close(pcap_t *p);

关闭 pcap_open_live() 打开的网络接口(即其返回值,pcap_t 类型指针),并释放相关资源。注意,操作完网络接口,应该释放其资源。

转载地址:http://uuhpi.baihongyu.com/

你可能感兴趣的文章
浅谈HTML
查看>>
css基础
查看>>
HTML&CSS进阶
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>