lipcap函数库.docx
《lipcap函数库.docx》由会员分享,可在线阅读,更多相关《lipcap函数库.docx(9页珍藏版)》请在冰豆网上搜索。
lipcap函数库
[1]intpcap_lookupnet(char*device,bpf_u_int32*netp,bpf_u_int32*maskp,char*errbuf);
功能该函数用于监测网卡所在网络的网络地址和子网掩码
参数
char*devic网卡的描述符指针,由pcap_looupdev函数获取;
bpf_u_int32*netp存放网络地址;
bpf_u_int32*maskp存放子网掩码;
char*errbuf存放出错信息;
返回值如果函数执行成功,则返回值为0,否则返回值为-1,并在errbuf中存放出错信息。
[2]char*pcap_lookupdev(char*errbuf);
功能获取一个合适的网卡描述,以供pcap_open_liver函数和pcap_lookupnet函数使用。
参数
char*errbuf存放pcap_lookupdev函数的出错信息;
返回值如果函数执行成功,则返回一个用于描述系统上的一个网卡的描述符的指针。
如果
失败,返回null,errbuf中存放出错信息。
[3]pcap_t*pcap_open_live(char*device,intsnaplen,intpromisc,intto_ms,char*ebuf)
功能打开网卡用来获得一个数据截获描述符,该描述符用
于查看在网络上传输的数据包;
参数
char*device指定的嗅探设备;
snaplenpcap捕获的最大字节数;
promisc是否将指定接口设为为混杂模式;
to_ms读取时的超时值,单位是毫秒,如果为0则一直嗅探直到错误发生,为-1则不确定;。
ebuf存入任何错误信息的字符串
返回值返回会话句柄。
实例:
#include
...
pcap_t*handle;
handle=pcap_open_live(somedev,BUFSIZ,1,0,errbuf);
实例说明该代码打开字符串somedev的设备,读取被BUFSIZ指定的字节数(BUFSIZ在pcap.h
里定义);设备被设置为混杂模式;一直嗅探到错误发生;如果有了错误,把它存放在字符串errbuf中。
[4]intpcap_compile(pcap_t*p,structbpf_program*fp,char*str,intoptimize,bpf_u_int32netmask)
功能编译表达式
参数
pcap_t*ppcap_open_live打开的设备接口句柄;
structbpf_program*fp存储被编译的过滤器版本的地址;
char*str表达式本身;
intoptimize是否被优化的整形量(0为false,1为true,标准规定);
bpf_u_int32netmask指定应用此过滤器的网络掩码;
返回值函数返回-1为失败,其他表明成功的
[5]intpcap_setfilter(pcap_t*p,structbpf_program*fp)
功能使用过滤器用于设定一个过滤器程序;
参数
pcap_t*p会话句柄;
structbpf_program*fp被编译表达式版本的引用(与pcap_compile()的第二个参数相同)。
实例:
#include
pcap_t*handle;/*会话的句柄*/
chardev[]="rl0";/*执行嗅探的设备*/
charerrbuf[PCAP_ERRBUF_SIZE];/*存储错误信息的字符串*/
structbpf_programfilter;/*已经编译好的过滤表达式*/
charfilter_app[]="port23";/*过滤表达式*/
bpf_u_int32mask;/*执行嗅探的设备的网络掩码*/
bpf_u_int32net;/*执行嗅探的设备的IP地址*/
pcap_lookupnet(dev,&net,&mask,errbuf);
handle=pcap_open_live(dev,BUFSIZ,1,0,errbuf);
pcap_compile(handle,&filter,filter_app,0,net);
pcap_setfilter(handle,&filter);
实例说明该程序使用混杂模式嗅探嗅探设备为r10,经由端口23的所有通信。
pcap_lookupnet(),向这个函数提供设备接口名,它将返回其IP和网络掩码,
我们需要知道网络掩码以便应用过滤器。
[6]u_char*pcap_next(pcap_t*p,structpcap_pkthdr*h)
功能获取单包
参数
pcap_t*p会话句柄;
structpcap_pkthdr*h指向一个包括了当前数据包总体信息(被捕获时的时间,包的长度,其被
指定的部分长度)的结构体的指针
返回值返回一个u_char指针给被这个结构体描述的包
实例:
#include
#include
intmain()
{
pcap_t*handle;/*会话句柄*/
char*dev;/*执行嗅探的设备*/
charerrbuf[PCAP_ERRBUF_SIZE];/*存储错误信息的字符串*/
structbpf_programfilter;/*已经编译好的过滤器*/
charfilter_app[]="port23";/*过滤表达式*/
bpf_u_int32mask;/*所在网络的掩码*/
bpf_u_int32net;/*主机的IP地址*/
structpcap_pkthdrheader;/*由pcap.h定义*/
constu_char*packet;/*实际的包*/
/*Definethedevice*/
dev=pcap_lookupdev(errbuf);
/*探查设备属性*/
pcap_lookupnet(dev,&net,&mask,errbuf);
/*以混杂模式打开会话*/
handle=pcap_open_live(dev,BUFSIZ,1,0,errbuf);
/*编译并应用过滤器*/
pcap_compile(handle,&filter,filter_app,0,net);
pcap_setfilter(handle,&filter);
/*截获一个包*/
packet=pcap_next(handle,&header);
/*打印它的长度*/
printf("Jackedapacketwithlengthof[%d]",header.len);
/*关闭会话*/
pcap_close(handle);
return(0);
}
实例说明:
该程序嗅探被pcap_lookupdev()返回的设备并将它置为混杂模式,在发现第一个包经过端口23(telnet)并且告诉用户此包的大小(以字节为单位)。
[7]intpcap_loop(pcap_t*p,intcnt,pcap_handlercallback,u_char*user)
功能设置获取到满足过滤规则后,数据包处理的回调函数
参数
pcap_t*p会话句柄
intcnt捕获数据包的个数
pcap_handlercallback回调函数的名称
u_char*user送往回调函数的参数
特殊说明该函数与pcap_dispatch完成相同的功能,但是与pacap_dispatch不同的就是
该函数忽略超时;而pacap_dispatch不忽略超时。
回调函数的原型:
voidgot_packet(u_char*args,conststructpcap_pkthdr*header,constu_char*packet);
回调函数说明:
1.函数返回void类型
2.参数u_char*args对应于pcap_loop()的最后一个参数
3.conststructpcap_pkthdr*header参数类型在pcap.h中包含,该结构体包含数据包被嗅探的时间、大小等信息
具体结构体信息如下所示:
strucpacap_pkthdr
{
structtimevalts;/*时间戳*/
bpf_u_int32caplen;/*已捕获部分的长度*/
bpf_u_int32len;/*该包的脱机长度*/
};
[8]intpcap_dispatch(pcap_t*p,intcnt,pcap_handlercallback,u_char*user);
功能捕捉报文、分发报文到预先指定好的处理函数(回调函数)。
函数说明pcap_dispatch()接收够cnt个报文便返回,如果cnt为-1意味着所有报文集中在一个缓
冲区中。
如果cnt为0,仅当发生错误、读取到EOF或者读超时到了(pcap_open_live中
指定)才停止捕捉报文并返回。
callback指定如下类型的回调函数,用于处理pcap_dispatch()所捕获的报文:
typedefvoid(*pcap_handler)(u_char*,conststructpcap_pkthdr*,constu_char*);
回掉函数参数:
u_char*为pcap_dispatch()的第3个形参;
structpcap_pkthdr*指向pcap_pkthdr结构,该结构位于真正的物理帧前面,用于消除不同链
路层支持的差异。
constu_char*最后的形参指向所捕获报文的物理帧。
函数返回值:
返回捕捉到的报文个数,如果在读取静态文件(以前包捕捉过程中存储下来的)时碰
到EOF则返回0。
返回-1表示发生错误,此时可以用pcap_perror()、pcap_geterr()
显示错误信息。
[9]voidpcap_close(pcap_t*p);
功能关闭pcap_open_live()获取的包捕捉句柄,释放相关资源。
关闭相关的文件并释放对应资源。
参数pcap_t*ppcap_open_live()获取的包捕捉句柄
返回值无
[10]voidpcap_perror(pcap_t*p,char*prefix);
功能输出函数调用时产生的错误
参数pcap_t*p来自pcap_open_live()的捕获数据包的句柄char*prefix与perror()
的形参相同,指定错误信息的前缀,与perror()一样,结尾自动输出一个换行。
实例
pcap_perror(p,"pcap_compile")的输出类似这个效果:
pcap_compile:
unknownipproto...
说明
pcap_perror并不自动exit(),与perror()一样,如果需要,应该显式调用exit()。
[11]pcap_t*pcap_open_offline(char*fname,char*ebuf)
功能打开以前保存捕获数据包的文件,用于读取。
参数fname参数指定打开的文件名。
该文件中的数据格式与tcpdump和tcpslice兼容。
"-"为标准输入。
ebuf参数则仅在pcap_open_offline()函数出错返回null时用于传递错误消息。
返回值会话句柄
[12]pcap_dumper_t*pcap_dump_open(pcap_t*p,char*fname)
功能打开用于保存捕获数据包的文件,用于写入。
参数p为调用pcap_open_offline()或pcap_open_live()函数后返回的pcap结构指针
fname参数指定打开文件名,如果为"-"时表示标准输出。
返回值出错时返回null。
如果返回null,则可调用pcap_geterr()函数获取错误消息。
[13]voidpcap_dump(u_char*user,structpcap_pkthdr*h,u_char*sp)
功能向调用pcap_dump_open()函数打开的文件输出一个数据包。
该函数可作为
cap_dispatch()函数的回调函数。
[14]intpcap_datalink(pcap_t*p)
功能返回数据链路层类型,例如dlt_en10mb。
[15]intpcap_snapshot(pcap_t*p)
功能返回pcap_open_live被调用后的snapshot参数值。
[16]intpcap_is_swapped(pcap_t*p)
功能返回当前系统主机字节与被打开文件的字节顺序是否不同。
[17]intpcap_major_version(pcap_t*p)
功能返回写入被打开文件所使用的pcap函数的主版本号。
[18]intpcap_minor_version(pcap_t*p)
功能返回写入被打开文件所使用的pcap函数的辅版本号。
[19]pcap_geterr()
功能函数来获取错误消息。
[20]intpcap_stats(pcap_t*p,structpcap_stat*ps)
功能向pcap_stat结构赋值。
成功时返回0。
这些数值包括了从开始
捕获数据以来至今共捕获到的数据包统计。
如果出错或不支持
数据包统计,则返回-1,且可调用pcap_perror()或
pcap_geterr()函数来获取错误消息。
[21]file*pcap_file(pcap_t*p)
功能返回被打开文件的文件名。
[22]intpcap_fileno(pcap_t*p)
功能返回被打开文件的文件描述字号码。
[23]char*pcap_strerror(interror)
功能如果strerror()函数不可用,则可调用pcap_strerror函数替代。