您的位置:首页 > 其它

WinPcap教程(1):获取网卡列表

2012-12-24 15:23 393 查看
本部分将向你展示如果使用WinPcap API的特性。它是以教程的方式来组织的,并细分为一系列的课程,以step-by-step的方式,向读者介绍如何利用WinPcap编程,从基本的功能(获取网卡列表,抓包等等)到最高级的功能(处理发送队列和收集网络流量统计数据)。

代码片段以及一些简单但是完整的程序可供参考:所有源码都有指向使用手册的链接,即只要在函数或者数据结构上点击,就会跳到对应的文档。(译注:本译文暂不提供该功能)

示例代码是用纯C写的,所以需要一些基本的C语言编程知识。同时,因为本教程需要使用一些函数库来处理“原生(raw)”网络包,因此假定你对网络和网络协议也比较熟悉。

1. 获取设备列表

典型地,基于WinPcap的应用要做的第一件事情,就是获取网络适配器(network adapter,后面将译为网卡)列表。为此目的,libcap和WinPcap都提供pcap_findalldevs_ex()函数,该函数返回一个pcap_if结构的链表(linked list),其中每项都包含了一个网卡的全部信息。

下面的代码获取网卡列表,并将该列表输出到屏幕上,如果没有发现网卡,则输出一个出错信息。

#include
"pcap.h"

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

/* Retrieve the device list from the local machine */
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);
}

/* Print the list */
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("/nNo interfaces found! Make sure WinPcap is installed./n");
return;
}

/* We don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
}

上面代码的一些说明:

首先,pcap_findalldevs_ex()函数,和别的libpcap函数一样,有一个errbuf参数。如果出了错误,这个参数指向一个由libpcap填充的关于错误信息的字符串。

其次,记住并非所有libpcap支持的操作系统都会提供网卡描述信息,因此,如果我们想编写可移植的程序,就必须考虑到描述信息为空的情况,在上面的程序中,我们输出“No description available”。

最后,注意一旦我们处理完毕,要调用pcap_freealldevs()来释放相关资源。

我们现在编译和运行这个程序。在Unix或者Cygwin环境下,键入下面命令编译:

gcc –o testprog testprog.c -lpcap

在Windows上,则需要按照VC中建立使用WinPcap的开发环境的指示创建一个项目。不过,我们还是建议你使用WinPcap developer’s pack
(可从WinPcap官网 http://www.winpcap.org 下载),因为它提供了很多项目形式的示例程序,包含了本教程所有代码,以及所有编译和运行这些示例程序的includes和libraries。

假定我们已经编译好上面的程序,运行它。在WinXP上,得到类似如下的结果(译注:不同的机器上得到结果有所不同):

1. /Device/NPF_{4E273621-5161-46C8-895A-48D0E52A0B83} (Realtek RTL8029(AS) Ethernet Adapter)

2. /Device/NPF_{5D24AE04-C486-4A96-83FB-8B5EC6C7F430} (3Com EtherLink PCI)

真如你所看到的,在Windows下,网卡的名称(当打开设备时,将会传给libpcap)阅读起来不甚方便,因此增加一些附加描述信息应该是很有帮助的。

此文章来自于【/article/7612547.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: