6.1.2 获得与释放网络适配器列表的实例

下面的实例代码的功能为:获取适配器的列表,并在屏幕上显示出来,在程序结束时释放设备列表;如果没有找到适配器,将打印错误信息,完整的代码见[ch6/getfreedevlist工程]。


defne WIN32

defne HAVE_REMOTE

include<stdio.h>

include"pcap.h"

int main()

{

pcap_if_t*alldevs;

pcap_if_t*d;

int i=0;

char errbuf[PCAP_ERRBUF_SIZE];

/获取本地机器的设备列表/

if(pcap_fndalldevs_ex(PCAP_SRC_IF_STRING,NULL,

&alldevs,errbuf)==-1)

{

//获取设备列表失败,程序返回

fprintf(stderr,"Error in pcap_fndalldevs_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)

{//没找到设备接口,确认WinPcap已安装,程序退出

printf("\nNo interfaces found!

Make sure WinPcap is installed.\n");

return-1;

}

/不再需要设备列表了,释放它/

pcap_freealldevs(alldevs);

return 0;

}


在获取适配器的列表时要记住以下几点:

❑pcap_findalldevs_ex函数和其他函数一样,一旦发生错误,errbuf参数将会被写入字符串类型的错误信息中。

❑不是所有的操作系统都支持WinPcap提供的网络程序接口,因此,如果想编写一个可移植的应用程序,就必须考虑在什么情况下,description是NULL。在本程序中遇到这种情况时,会打印提示语句"(No description available)"。

❑当设备列表使用完毕后,要调用pcap_freealldevs函数将其占用的内存资源释放掉。

在一台安装Windows XP操作系统的计算机上,运行该程序得到的结果如下所示:


1.rpcap://\Device\NPF_GenericDialupAdapter(Network adapter'Adapter for generic dialup and VPN capture'on local host)

2.rpcap://\Device\NPF_{349D565F-235A-4B5C-8B9E-AB3B347EC200}(Network adapter'Marvell Yukon Ethernet Controller.(Microsoft's Packet Scheduler)'on local host)


Windows平台下网络适配器的名称人工读起来相当费力,故解释性的描述是很重要的。