利用libpcap抓包(一)----------libpcap基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sophisticated_/article/details/83338772

libpcap安装

先安装flex,bison

yum -y install flex
yum -y install bison

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

./configure
make
make 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 类型指针),并释放相关资源。注意,操作完网络接口,应该释放其资源。

猜你喜欢

转载自blog.csdn.net/Sophisticated_/article/details/83338772