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);