WinPcap笔记(2):获取设备列表

通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器列表。WinPcap提供了pcap_findalldevs_ex()函数来实现这个功能:返回一个pcap_if结构的链表,这样的结构都包含了一个适配器的详细信息。pcap_findalldevs_ex()函数的具体格式如下:

pcap_findalldevs_ex(
                    char * source,
                    struct pcap_rmthauth* auth,
                    pcap_if_t** alldevs,
                    char* errbuf
                   );

函数创建一个可以被函数pcap_open()打开的网络设备链表。这个函数不但可以列出本地机器的所有设备,还可以列出远程机器的所有设备。

参数含义:

source:一个字符指针,保存来源的位置,会在查找适配器的时候检查,在这里设置成PCAP_SRC_IF_STRING;

auth:一个指向pcap_rmtauth结构体的指针。这个指针保存需要远程设备捕获协议认证的信息。由于我们捕本地设备,因此设置成NULL;

alldevs:一个pcap_if_t结构体指针,函数返回时用来保存找到的适配器的信息;

errbuf:用来保存错误信息;

返回值:

如果返回0,表示函数运行成功,此时alldevs不可能是NULL,说明找到合适的适配器,同过alldevs参数返回;如果返回-1,发生错误,或者没有在本地找到合适的适配器;

pcap_if_t结构体定义如下:

pcap_if* next;//指向链表的下一个节点,如果不为空指向一个pcap_if元素;

char* name;//字符串指针,存储传向pcap_open_live函数的设备名称;

char* description;//设备的描述;

pcap_addr* addresses;//这项这个设备接口地址链表的第一个元素;

u_int flags;//当前唯一的值是PCAP_IF_LOOPBACK,当当前接口是回路接口的时候设置;

当我们完成设备列表的使用后,应当调用pcap_freealldevs()函数释放内存资源。

下面是获取设备列表并打印具体信息的代码:

#include "pcap.h"

int main()
{
	pcap_if_t *alldevs;
	pcap_if_t *d;
	int i = 0;
	char errbuf[PCAP_ERRBUF_SIZE];

	/*获取本地机器设备列表*/
	if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL/*auth is not needed*/, &alldevs, errbuf) == -1)
	{
		fprintf(stderr, "Error in pcap_findalldevs_ex:%s\n", errbuf);
		exit(1);
	}
	/*打印列表*/
	for (d = alldevs;d != NULL;d=d->next)
	{
		printf("%d. %s", i++, d->name);
		if (d->description)
			printf(" (%s)\n", d->description);
		else
			printf(" (No description available)\n");
	}

	if (i == 0)
	{
		printf("\n No interfaces found!\n");
		exit(1);
	}
	//free
	pcap_freealldevs(alldevs);
	return 0;
}
结果如下:

WinPcap笔记(2):获取设备列表_第1张图片

你可能感兴趣的:(WinPcap)