6.1 使用WinPcap选择合适的适配器

WinPcap可以获得本地主机、远程主机及文件这三种类型的适配器设备列表。本章主要关注获得与释放本地主机适配器设备列表的实现细节。图6-1所示只给出了与其相关的重要函数调用关系。后续各节将会按照从用户空间到内核空间的顺序,详细描述各重要函数的具体实现。

6.1 使用WinPcap选择合适的适配器 - 图1

图 6-1 函数调用关系图

6.1.1 wpcap.dll库导出的相应函数

wpcap.dll库为了获得与释放已连接的网络适配器设备列表,提供了下列函数。

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


int pcap_fndalldevs(pcap_if_t*alldevsp,charerrbuf);


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


int pcap_fndalldevs_ex(char*source,

struct pcap_rmtauthauth,pcap_if_t**alldevs,charerrbuf);


pcap_freealldevs函数用于释放适配器列表,其应用格式如下:


void pcap_freealldevs(pcap_if_t*alldevsp);


pcap_findalldevs_ex函数和pcap_findalldevs函数分别返回pcap_if_t类型的列表alldevs和alldevsp。每个pcap_if_t结构体实例都包含着一个适配器的详细信息,其中成员name和description分别表示一个适配器的名称和一个更容易让人理解的描述。

pcap_if_t结构体的具体定义如下:


typedef struct pcap_if pcap_if_t;

struct pcap_if{

/如果不为NULL,则指向列表的下一个元素。如果为NULL,则为列表尾部/

struct pcap_if*next;

/给pcap_open_live函数传递的一个描述设备名称的字符串指针/

char*name;

/如果不为NULL,则指向描述设备的一个可读字符串/

char*description;

/一个指向接口地址列表第一个元素的指针/

struct pcap_addr*addresses;

/*

*PCAPIF接口标志。当前仅有的可能标志为PCAP_IF_LOOPBACK,

*如果接口是回环,则设置该标志

*/

bpf_u_int32 fags;

};


上述代码中,结构体pcap_addr表示接口地址的信息,其具体定义如下:


typedef struct pcap_addr pcap_addr_t;

struct pcap_addr{

struct pcap_addrnext;/指向下一个元素的指针*/

struct sockaddraddr;/IP地址*/

struct sockaddrnetmask;/网络掩码*/

struct sockaddrbroadaddr;/广播地址*/

struct sockaddrdstaddr;/P2P目的地址*/

};