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

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

 

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

 

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

 

1. 获取设备列表

典型地,基于WinPcap的应用要做的第一件事情,就是获取网络适配器(network adapter,后面将译为网卡)列表。为此目的,libcapWinPcap都提供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 developers pack (可从WinPcap官网 http://www.winpcap.org 下载),因为它提供了很多项目形式的示例程序,包含了本教程所有代码,以及所有编译和运行这些示例程序的includeslibraries

 

假定我们已经编译好上面的程序,运行它。在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):获取设备高级信息

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值