libpcap库函数介绍

libpcap的英文意思是 Packet Capturelibrary,即数据包捕获函数库。该库提供的C函数接口可用于需要捕获经过网络接口(只要经过该接口,目标地址不一定为本机)数据包的系统开发上。由Berkeley大学Lawrence Berkeley NationalLaboratory研究院的Van Jacobson、CraigLeres和Steven McCanne编写,目前的最新版本为0.4。该函数库支持Linux、Solaris和*BSD系统平台。


主要接口函数说明如下:


pcap_t *pcap_open_live(char *device, int snaplen,


int promisc, int to_ms, char *ebuf)


获得用于捕获网络数据包的数据包捕获描述字。device参数为指定打开


的网络设备名。snaplen参数定义捕获数据的最大字节数。promisc指定


是否将网络接口置于混杂模式。to_ms参数指定超时时间(毫秒)。


ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消


息。


pcap_t *pcap_open_offline(char *fname, char *ebuf)


打开以前保存捕获数据包的文件,用于读取。fname参数指定打开的文


件名。该文件中的数据格式与tcpdump和tcpslice兼容。\"-\"为标准输


入。ebuf参数则仅在pcap_open_offline()函数出错返回NULL时用于传


递错误消息。


pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)


打开用于保存捕获数据包的文件,用于写入。fname参数为\"-\"时表示


标准输出。出错时返回NULL。p参数为调用pcap_open_offline()或


pcap_open_live()函数后返回的pcap结构指针。fname参数指定打开


的文件名。如果返回NULL,则可调用pcap_geterr()函数获取错误消


息。


char *pcap_lookupdev(char *errbuf)


用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络


设备名指针。如果函数出错,则返回NULL,同时errbuf中存放相关的


错误消息。


int pcap_lookupnet(char *device, bpf_u_int32 *netp,


bpf_u_int32 *maskp, char *errbuf)


获得指定网络设备的网络号和掩码。netp参数和maskp参数都是


bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相


关的错误消息。



int pcap_dispatch(pcap_t *p, int cnt,


pcap_handler callback, u_char *user)


捕获并处理数据包。cnt参数指定函数返回前所处理数据包的最大值。


cnt=-1表示在一个缓冲区中处理所有的数据包。cnt=0表示处理所有


数据包,直到产生以下错误之一:读取到EOF;超时读取。callback


参数指定一个带有三个参数的回调函数,这三个参数为:一个从


pcap_dispatch()函数传递过来的u_char指针,一个pcap_pkthdr结构


的指针,和一个数据包大小的u_char指针。如果成功则返回读取到的


字节数。读取到EOF时则返回零值。出错时则返回-1,此时可调用


pcap_perror()或pcap_geterr()函数获取错误消息。


int pcap_loop(pcap_t *p, int cnt,


pcap_handler callback, u_char *user)


功能基本与pcap_dispatch()函数相同,只不过此函数在cnt个数据包


被处理或出现错误时才返回,但读取超时不会返回。而如果为


pcap_open_live()函数指定了一个非零值的超时设置,然后调用


pcap_dispatch()函数,则当超时发生时pcap_dispatch()函数会返回。


cnt参数为负值时pcap_loop()函数将始终循环运行,除非出现错误。


void pcap_dump(u_char *user, struct pcap_pkthdr *h,


u_char *sp)


向调用pcap_dump_open()函数打开的文件输出一个数据包。该函数可


作为pcap_dispatch()函数的回调函数。


int pcap_compile(pcap_t *p, struct bpf_program *fp,


char *str, int optimize, bpf_u_int32 netmask)


将str参数指定的字符串编译到过滤程序中。fp是一个bpf_program结


构的指针,在pcap_compile()函数中被赋值。optimize参数控制结果


代码的优化。netmask参数指定本地网络的网络掩码。



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


指定一个过滤程序。fp参数是bpf_program结构指针,通常取自


pcap_compile()函数调用。出错时返回-1;成功时返回0。


u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)


返回指向下一个数据包的u_char指针。


int pcap_datalink(pcap_t *p)


返回数据链路层类型,例如DLT_EN10MB。


int pcap_snapshot(pcap_t *p)


返回pcap_open_live被调用后的snapshot参数值。


int pcap_is_swapped(pcap_t *p)


返回当前系统主机字节与被打开文件的字节顺序是否不同。


int pcap_major_version(pcap_t *p)


返回写入被打开文件所使用的pcap函数的主版本号。


int pcap_minor_version(pcap_t *p)


返回写入被打开文件所使用的pcap函数的辅版本号。


int pcap_stats(pcap_t *p, struct pcap_stat *ps)


向pcap_stat结构赋值。成功时返回0。这些数值包括了从开始


捕获数据以来至今共捕获到的数据包统计。如果出错或不支持


数据包统计,则返回-1,且可调用pcap_perror()或


pcap_geterr()函数来获取错误消息。


FILE *pcap_file(pcap_t *p)


返回被打开文件的文件名。


int pcap_fileno(pcap_t *p)


返回被打开文件的文件描述字号码。


void pcap_perror(pcap_t *p, char *prefix)


在标准输出设备上显示最后一个pcap库错误消息。以prefix参


数指定的字符串为消息头。


char *pcap_geterr(pcap_t *p)


返回最后一个pcap库错误消息。


char *pcap_strerror(int error)


如果strerror()函数不可用,则可调用pcap_strerror函数替代。


void pcap_close(pcap_t *p)


关闭p参数相应的文件,并释放资源。


void pcap_dump_close(pcap_dumper_t *p)




#include
#include
#define CAP_LEN 2048
#define FILENAME \"rh\"
#define _DEBUG_


int main()
{
bpf_u_int32 localnet,netmask;
struct bpf_program fcode;
pcap_handler printer;


pcap_dumper_t*p;
char ebuf;
char * device;
u_char * pcap_userdata;
pcap_t * pd;
int dev_flag=1;
int cap_len=CAP_LEN;
int i;


device=pcap_lookupdev(ebuf);
if (device == NULL)
exit(printf(\"%s n\", ebuf));
#ifdef _DEBUG_
printf(\"device is %s \\n\",device);
#endif
pd=pcap_open_live(device,cap_len,dev_flag,1000,ebuf);
if(pd == NULL)
exit(printf(\"%s\\n\",ebuf));


i=pcap_snapshot(pd);
if(cap_len < i) {
printf(\"snaplen raised from %d to %d \\n\", cap_len, i);
cap_len=i;
}
if(pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
localnet=0;
netmask=0;
printf(\"%s\\n\", ebuf);
}
if (pcap_compile(pd, &fcode, \"\", 1, netmask) < 0)
exit(printf(\"Error %s\\n\",\"pcap_compile\"));
if (pcap_setfilter(pd,&fcode) < 0)
exit(printf(\"Error %s\\n\",\"pcap_setfilter\"));


p=pcap_dump_open(pd,FILENAME);
if(p == NULL)
exit(printf(\"Error:%s\\n\",\"pcap_dump_open\"));
printer=pcap_dump;
pcap_userdata=(u_char *)p;


if(pcap_loop(pd, -1, printer, pcap_userdata) < 0)
exit(printf(\"Error, %s\\n\",\"pcap_loop\"));


pcap_close(pd);
exit(0);
}


关闭相应的被打开文件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值