7.1.2 关键数据结构pcap_t

结构体pcap_t提供对一个已打开适配器实例的描述。该结构体对用户来说是透明的,可通过wpcap.dll库提供的函数对其内容进行维护。下面介绍在Windows平台上pcap_t结构体所使用的主要成员。


typedef struct pcap pcap_t;

struct pcap{

ADAPTER*adapter;

LPPACKET Packet;

int nonblock;

int snapshot;

int linktype;/网络数据链路层的类型/

int linktype_ext;/linktype成员的扩展信息/

int tzoff;/时区偏移/

int offset;/正确对齐的偏移/

int activated;/如果捕获已经准备好开始,则为true/

int oldstyle;/如使用pcap_open_live函数,就设置为1/

int break_loop;/用来强制从数据包循环中读取退出的标志/

struct pcap_sf sf;

struct pcap_md md;

struct pcap_opt opt;

/读缓冲区/

int bufsize;

u_char*buffer;

u_char*bp;

int cc;

/pcap_next的位置持有者/

u_char*pkt;

/只接收这方向/这些方向的数据包/

pcap_direction_t direction;

/各种方法,具体定义参见后续内容/

activate_op_t activate_op;

can_set_rfmon_op_t can_set_rfmon_op;

read_op_t read_op;

inject_op_t inject_op;

setflter_op_t setflter_op;

setdirection_op_t setdirection_op;

set_datalink_op_t set_datalink_op;

getnonblock_op_t getnonblock_op;

setnonblock_op_t setnonblock_op;

stats_op_t stats_op;

setbuff_op_t setbuff_op;

setmode_op_t setmode_op;

setmintocopy_op_t setmintocopy_op;

cleanup_op_t cleanup_op;

/如果数据包过滤不在内核空间,在此放置过滤器代码/

struct bpf_program fcode;

char errbuf[PCAP_ERRBUF_SIZE+1];

int dlt_count;

u_int*dlt_list;

/pcap_next_ex工作所需的链表/

struct pcap_pkthdr pcap_header;

};


结构体pcap_t中所定义的一些函数指针原型如下所示:


typedef int(activate_op_t)(pcap_t);

typedef int(can_set_rfmon_op_t)(pcap_t);

typedef int(read_op_t)(pcap_t,int cnt,pcap_handler,u_char*);

typedef int(inject_op_t)(pcap_t,const void*,size_t);

typedef int(setflter_op_t)(pcap_t,struct bpf_program*);

typedef int(setdirection_op_t)(pcap_t,pcap_direction_t);

typedef int(set_datalink_op_t)(pcap_t,int);

typedef int(getnonblock_op_t)(pcap_t,char*);

typedef int(setnonblock_op_t)(pcap_t,int,char*);

typedef int(stats_op_t)(pcap_t,struct pcap_stat*);

typedef int(setbuff_op_t)(pcap_t,int);

typedef int(setmode_op_t)(pcap_t,int);

typedef int(setmintocopy_op_t)(pcap_t,int);

typedef void(cleanup_op_t)(pcap_t);