程序员可以使用两类API,一类是直接映射到内核调用的原始函数,包含在packet.dll中;另一类是wpcap.dll提供的高层函数。
packet.dll函数控制能力强大,可以设置数据包重发次数、内核级缓冲区大小、查看网卡MAC类型、查看捕获统计信息等。
wpcap.dll函数用户更容易掌握,下面主要介绍wpcap.dll的编程方法,示例程序也是基于wpcap.dll实现的。与wpcap.dll相关的所有的数据结构和函数都在头文件pcap.h中定义和声明。此头文件包含在WpdPack文件夹的Include目录下。
1.wpcap.dll的数据结构
wpcap.dll定义了适配器接口、IP地址、数据包和捕获统计信息等的数据结构。下面列出了几个主要的数据结构。
(1)接口数据结构
这个结构包含了一个网络适配器的详细信息。
(2)接口地址结构
(3)捕获数据包的头部结构
(4)捕获数据包统计信息的结构
2.wpcap.dll的函数
wpcap.dll的函数提供了在用户指定的网卡上收发数据包的功能,并且可以设置过滤规则。下面介绍几个主要的函数。(www.daowen.com)
1)int pcap_findalldevs(pcap_if_t* * alldevs,char * errbuff)。获取本机所有网络接口设备的信息。如果返回成功则alldevs中包含全部网络接口设备的信息,失败则返回-1。
2)pcap_t * pcap_open_live(constchar * devicename,in tsnaplen,int promisc,int to_ms,char * errbuf)。打开一个网络接口设备。输入参数如下:pcap_t(Winpcap自己定义的句柄,用于表示网络接口设备)、devicename(设备名)、snaplen(一个包中截获的字节数,通常设为65535,即一个IP包的长度)、promisc(捕获模式,1代表混杂模式,0代表正常模式)、to_ms(时延,即接收函数返回的时间,单位ms)和errbuf(错误信息)。
3)int pcap_compile(pcap_t * p,structbpf_program * fp,char * str,int optimize,bpf_u_int32netmask)。编译过滤规则,把高层的过滤规则解释成能被过滤引擎集成到数据包驱动中低级字节码。str表示规则串。过滤规则表达式在前面讲述Wireshork时介绍过。
4)int pcap_setfilter(pcap_t * p,structbpf_program * fp)。设置过滤规则,把一个过滤器与核心驱动的抓包会话关联起来。在编译了过滤器之后必须调用pcap_setfilter函数设置内核过滤器方能使过滤规则生效。
5)int pcap_next_ex(pcap_t * p,structpcap_pkthdr * * pkt_header,const u_char * * pkt_data)。从网卡或者数据包文件中读取一个数据包。
6)int pcap_sendpacket(pcap_t * p,constu_char * buf,intsize)。发送一个原始数据包。
7)int pcap_dispatch(pcap_t * p,int cnt,pcap_handler callback,u_char * user)。捕获并处理数据包。p为指向网卡的指针,cnt参数指定函数返回前所处理的数据包的最大值,cnt=-1时表示在一个缓冲区中处理所有的数据包,cnt=0表示处理所有的数据包,直到读取到EOF或超时读取。callback参数指定一个带有3个参数的回调函数,3个参数为:一个从pcap_dispatch()函数传递过来的u_char指针,一个pcap_pkthdr结构的指针和一个数据包大小的u_char指针。如果成功则返回读取到的字节数,读取到EOF则返回0,出错返回-1。
8)int pcap_loop(pcap_t * p,int cnt,pcap_handler callback,u_char * user)。循环抓取网络数据报文,每捕获到cnt个报文就调用callback用户函数。输入参数p为指向网卡的指针,cnt为每一次捕获包数,callback为用户自定义的处理函数,user一般为空。注意,该函数功能与pcap_dispatch()函数功能基本相同,只不过此函数在cnt个数据包被处理或遇见错误时才返回,超时不会返回。如果为pcap_open_live()函数指定一个非零值的超时设置,然后调用pcap_dispatch()函数,则当超时发生时pcap_dispatch()函数会返回,而pcap_loop()函数不会,它将始终循环执行,除非出现错误。
9)void pcap_close(pcap_t * p)。关闭与网络接口p相关联的文件,并释放资源。
10)void pcap_freealldevs(pcap_if_t * alldevs)。释放打开的接口和相关的资源。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。