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平台下网络适配器的名称人工读起来相当费力,故解释性的描述是很重要的。