2.5 用户空间库接口函数

本节简要介绍wpcap.dll与Packet.dll库提供的主要接口函数,详细的说明参见后续各章的相关内容。

2.5.1 wpcap.dll库中的重要函数

wpcap.dll库中的接口函数分为两部分:一部分是与libpcap库兼容的,另一部分是与libpcap库不兼容的,现分别介绍如下。

1.与libpcap库兼容的函数

第一部分是与libpcap库兼容的函数,其可兼容UNIX平台,所以这些函数可在Windows与Linux平台上工作。这些函数如下所示。

pcap_open_live函数用于打开本地主机的网络适配,并且可进行网络数据包的捕获,其原型如下:


pcap_tpcap_open_live(const chardevice,int snaplen,int promisc,int to_ms,char*ebuf);


pcap_open_dead函数用于创建一个pcap_t结构体,而不是用于数据捕获,其原型如下:


pcap_t*pcap_open_dead(int linktype,int snaplen);


pcap_open_offline函数用于打开一个libpcap格式的存储文件,来读取数据包,其原型如下:


pcap_tpcap_open_offine(const charfname,char*errbuf);


pcap_close函数用来释放打开函数pcap_openXXX所获得的相关资源,其原型如下:


void pcap_close(pcap_t*p);


pcap_findalldevs函数用于返回所找到的适配器列表,其原型如下:


int pcap_fndalldevs(pcap_if_t*alldevsp,charerrbuf);


pcap_freealldevs函数用于释放由pcap_findalldevs返回的适配器列表,其原型如下:


void pcap_freealldevs(pcap_if_t*alldevsp);


pcap_handler为捕获数据包的回调函数的原型,其原型如下:


typedef void(pcap_handler)(u_charuser,const struct pcap_pkthdrpkt_header,const u_charpkt_data);


pcap_dispatch函数用于接收一组数据包,其原型如下:


int pcap_dispatch(pcap_tp,int cnt,pcap_handler callback,u_charuser);


pcap_loop函数用于接收一组数据包,其原型如下:


int pcap_loop(pcap_tp,int cnt,pcap_handler callback,u_charuser);


pcap_breakloop函数用于设置一个标志位,该标志会强制pcap_dispatch函数或pcap_loop函数返回,不再继续循环,其原型如下:


void pcap_breakloop(pcap_t*);


pcap_next函数用于返回下一个可用的数据包,其原型如下:


u_charpcap_next(pcap_tp,struct pcap_pkthdr*h);


pcap_next_ex函数用于从一个网络适配器设备或从一个脱机文件中读取一个数据包,替代pcap_next()函数,其原型如下:


int pcap_next_ex(pcap_tp,struct pcap_pkthdr*pkt_header,const u_charpkt_data);


pcap_sendpacket函数用于发送单个原始数据包一次或多次,其原型如下:


int pcap_sendpacket(pcap_tp,u_charbuf,int size);


pcap_compile函数用于将一个用高级语言描述的过滤表达式编译成一个能够被过滤虚拟机所执行的低层字节码,其原型如下:


int pcap_compile(pcap_tp,struct bpf_programfp,char*str,int optimize,bpf_u_int32 netmask);


pcap_comiple_nopcap函数用于将高级语言描述的过滤表达式转换成能被过滤虚拟机所执行的低层字节码。该函数在不需要打开适配器的情况下就可以执行此转换,其原型如下:


int pcap_compile_nopcap(int snaplen_arg,int linktype_arg,struct bpf_programprogram,charbuf,int optimize,bpf_u_int32 mask);


pcap_setfilter函数用于将一个过滤器的字节码与一个内核捕获实例相关联,其原型如下:


int pcap_setflter(pcap_tp,struct bpf_programfp);


pcap_freecode函数用于释放pcap_compile或pcap_compile_nopcap函数用来存储字节码的program结构体,其原型如下:


void pcap_freecode(struct bpf_program*fp);


pcap_stats函数用于返回当前捕获的统计信息,其原型如下:


int pcap_stats(pcap_tp,struct pcap_statps);


pcap_dump_open函数用于打开一个文件,写入数据包,其原型如下:


pcap_dumper_tpcap_dump_open(pcap_tp,const char*fname);


pcap_dump函数用于将数据包存储到文件,其原型如下:


void pcap_dump(u_charuser,const struct pcap_pkthdrh,const u_char*sp);


pcap_dump_flush函数将输出缓冲写入存储文件,这样,任何使用pcap_dump函数存储但还没有写入文件的数据包,会被立刻写入文件,其原型如下:


int pcap_dump_fush(pcap_dumper_t*p);


pcap_dump_close函数用于关闭一个存储文件,其原型如下:


void pcap_dump_close(pcap_dumper_t*p);


2.与libpcap不兼容的函数

第二部分是与libpcap不兼容的函数,是针对Windows平台的部分扩展函数,是对libpcap库的扩展,只能用于Windows平台。

pcap_live_dump函数用于将捕获的数据存储到内核文件中,其原型如下:


int pcap_live_dump(pcap_tp,charflename,int maxsize,int maxpacks);


pcap_live_dump_ended函数用于判断内核文件存储是否结束,其原型如下:


int pcap_live_dump_ended(pcap_t*p,int sync);


pcap_stats_ex函数用于返回当前捕获的统计信息,其原型如下:


struct pcap_statpcap_stats_ex(pcap_tp,int*pcap_stat_size);


pcap_setmode函数用于将工作模式设置为mode,其原型如下:


int pcap_setmode(pcap_t*p,int mode);


pcap_setmintocopy函数用于定义最少字节数,对适配器执行一次读操作时,要求内核缓冲区中的数据达到该字节数后才可返回,其原型如下:


int pcap_setmintocopy(pcap_t*p,int size);


pcap_sendqueue_alloc函数用于分配一个发送队列,其原型如下:


pcap_send_queue*pcap_sendqueue_alloc(u_int memsize);


pcap_sendqueue_destroy函数用于释放与一个发送队列相关的所有资源,其原型如下:


void pcap_sendqueue_destroy(pcap_send_queue*queue);


pcap_sendqueue_queue函数用于把一个原始数据包添加到queue参数所指定的发送队列的尾部,其原型如下:


int pcap_sendqueue_queue(pcap_send_queuequeue,const struct pcap_pkthdrpkt_header,const u_char*pkt_data);


pcap_sendqueue_transmit函数用于发送一个数据包队列到网络,其原型如下:


u_int pcap_sendqueue_transmit(pcap_tp,pcap_send_queuequeue,int sync);


pcap_findalldevs_ex函数用于返回所找到的适配器列表,其原型如下:


int pcap_fndalldevs_ex(charsource,struct pcap_rmtauthauth,pcap_if_t*alldevs,charerrbuf);


pcap_open函数用于打开一个通用的数据捕获源(包括本地主机、远程主机、文件三种类型),以便进行捕获或发送操作,其原型如下:


pcap_tpcap_open(const charsource,int snaplen,int fags,

int read_timeout,struct pcap_rmtauthauth,charerrbuf);