pcap库简介
时间:2010-06-01 来源:长江货郎
在网络包抓取中pcap库是非常常用的一个库。目前它支持读取,虽然有几个可以往数据链路层写的函数。它支持多种操作系统:
Berkeley衍生系统下的BPF
Solaris2.x下的DLPI
SUNOS4.1.x的NIT
linux下的SOCK_PACKET
...
它提供了更高级的包抓取接口。它不仅能抓取本地的包,也可以抓取目的地址是其他主机的包。tcpdump就是用它来实现的。
下面是pcap提供的头文件和所有函数:
#include <pcap.h>
pcap_t *pcap_open_live(char *device, int snaplen,
int promisc, int to_ms, char *ebuf)
pcap_t *pcap_open_offline(char *fname, char *ebuf)
pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)
char errbuf[PCAP_ERRBUF_SIZE];
char *pcap_lookupdev(char *errbuf)
int pcap_lookupnet(char *device, bpf_u_int32 *netp,
bpf_u_int32 *maskp, char *errbuf)
int pcap_dispatch(pcap_t *p, int cnt,
pcap_handler callback, u_char *user)
int pcap_loop(pcap_t *p, int cnt,
pcap_handler callback, u_char *user)
void pcap_dump(u_char *user, struct pcap_pkthdr *h,
u_char *sp)
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)
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
int pcap_datalink(pcap_t *p)
int pcap_snapshot(pcap_t *p)
int pcap_is_swapped(pcap_t *p)
int pcap_major_version(pcap_t *p)
int pcap_minor_version(pcap_t *p)
int pcap_stats(pcap_t *p, struct pcap_stat *ps)
FILE *pcap_file(pcap_t *p)
int pcap_fileno(pcap_t *p)
void pcap_perror(pcap_t *p, char *prefix)
char *pcap_geterr(pcap_t *p)
char *pcap_strerror(int error)
void pcap_close(pcap_t *p)
void pcap_dump_close(pcap_dumper_t *p)
下面对函数做一简单的介绍:
pcap_open_live()被用来得到一个包抓取得描述符。错误时返回NULL.
device是一个指出要抓取的网络设备的字符串。
snaplen指明最大可抓取的字节长度。
promisc置位表明该接口要被设置成混杂模式。(注:如果这个参数是false,也可能有别的原因把这个接口设成了混杂模式。
to ms以毫秒为单位设置超时时间。
ebuf被用来存放当pcap_open_live()调用失败时,返回的错误字符串。
pcap_open_offline()被用来打开一个savefile以供读取。
fname:文件名,savefile具有用tcpdump()和tcpslice()所生成的文件一样的格式。如果用"-",则表示标准输入。
ebuf被用来存放当pcap_open_offline()调用失败时,返回的错误字符串。
pcap_dump_open()被用来打开一个savefile以供写入。
fname:文件名。如果用"-",则表示标准输出。
p:具有pcap struct的结构。是 pcap_open_offline()和pcap_open_live()的返回值。
如果返回NULL,可以用 pcap_geterr()读取错误值。
pcap_lookupdev()返回一个可以用在pcap_open_live()和pcap_lookupnet()的设备名。
ebuf被用来存放当pcap_lookupdev()调用失败时,返回的错误字符串。
pcap_lookupnet()被用来确定域网络设备相关的网络号和掩码。
pcap_dispatch()被用来收集和处理包。
cnt指定每次返回之前可以处理的最大的包数。-1代表处理一个缓冲区内的所有包。0代表处理所有的包,直到错误发生,文件结束,读取时间超时返回。
callback被用来指定一个被用来调用的函数。它由3个参数:一个u_char的由pcap_dispatch()传来的指针,一个pcap_pkthdr struct(用来处理实际的网络包头和数据),一个u_char的指向数据的指针。
函数返回的是读取的数据包数。到达EOF将返回0。-1错误。用pcap_perror()或pcap_geterr()可以读取错误提示。
pcap_dump()输出一个包到pcap_dump_open()所打开的savefile中。
pcap_compile()把一个字符串编译到一个过滤程序中。
program是一个指向bpf_program struct的指针。将被pcap_compile()填入。
optimize指明是否需要优化编译结果。
netmask指明本地的网络掩码。
pcap_setfilter()被用来指定一个过滤程序。
fp是指向bpf_program struct数组的指针。一般是调用pcap_compile()的结果。
pcap_loop()非常像pcap_dispatch(),唯一不同的是它将保留所有读到的包直到cnt个包被处理或者发生错误。负数将使它永远循环。
pcap_next()返回下一个包的指针。
pcap_datalink()返回数据链路层的类型,如10M以太,DLT_EN10MB.
pcap_snapshot() 返回pcap_open_live调用时所指定的snapshot length.
pcap_is_swapped()当savefile的字节顺序和当前系统的字节顺序不同的时候返回true.
pcap_major_version()和pcap_minor_version()分别返回当前的pcap的版本大小号。
pcap_file()返回当前的savefile文件名。
pcap_stats()返回一个pcap_stat的结构。结构中是从程序运行到现在所截到的包的一个统计数据。如果有错,则说明低层不支持统计。
pcap_fileno()返回savefile的表述符号。
pcap_error(),pcap_geterr()打印上一个pcap库的错误。
pcap_close()关闭和p相关联的文件,并释放资源。
pcap_dump_close()关闭savefile.
pcap库的作者:
Van Jacobson, Craig Leres and Steven McCanne, all of the
Lawrence Berkeley National Laboratory, University of Cali-
fornia, Berkeley, CA.