本部分将向你展示如果使用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)阅读起来不甚方便,因此增加一些附加描述信息应该是很有帮助的。
后篇:WinPcap教程(2):获取设备高级信息