6.1 使用WinPcap选择合适的适配器
WinPcap可以获得本地主机、远程主机及文件这三种类型的适配器设备列表。本章主要关注获得与释放本地主机适配器设备列表的实现细节。图6-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目的地址*/
};