其实代码WpdPack里都有,我要做的是在自己学习的基础上写下自己的理解,以及一些细节应该注意的问题。
 
使用winpcap编程,首先下载WpdPack,然后导入include和lib目录,在工程中配置好wpcap.lib和Packet.lib,就可以使用winpcap进行编程了,具体方法网上很多,我就不罗嗦了。
 
这次要写的是文档的第一篇 获取设备列表
 
首先要明白1个结构体的定义1个winpcap函数
 
pcap_f_t    这是一个保存设备名字和描述的结构体链表结构,有四个成员变量,
 
        pcap_f  *next     这是一个指向pcap_f结构的指针,其实就是链表中指向下一个元
        素的next,而pcap_f结构和pcap_f_t其实是一个结构 typedef struct pcap_f pcap_f_t
 
        char *name    这个指针指向你网络适配器的名字
 
        char *description 这个指针指向对网络适配器的详细描述
 
        pcap_addr *address  看文档貌似是指向链表第一个元素的地址,也就是说指向    
        链表中第一个网络适配器的地址,这个本例中用不到,暂且不管
 
        u_int flags 暂时用不到,不做解释
 
pcap_findalldevs_ex函数,定义如下

int pcap_findalldevs_ex  ( char *  source   //用来判断是获取本地还是远程适配器, 
  struct pcap_rmtauth *  auth,                  //本例用不到暂不做解释
  pcap_if_t **  alldevs,                           //把上面pcap_f_t的结构放进去来获取网卡信息
  char *  errbuf                                     //存放出错信息
 ) 
 
注意两点 第一个参数char *source 如果赋值PCAP_SRC_IF_STRING则表示列出所有本地的适配器
还有第二个参数的定义是pcap_if_t ** ,注意要把第一个结构体指针的地址传进去
 
 
在进行编程前还要注意一点,找到pcap.h文件,打开它,在#include <pcap/pcap.h>这句之前加上#define HAVE_REMOTE ,否则可能会报错说上面的结构体和函数都没有定义,看到网上有人说要加入#include "remote-ext.h" ,但其实加上以后会出现#error : Please do not include this file directly. Just define HAVE_REMOTE and then include pcap.h 意思是说不要包含这个头文件,而要定义HAVE_REMOTE宏,所以按照我上面说的做就可以了。
 
好了,准备工作做好了,以下是代码
 
#include "pcap.h"
#include "stdio.h"
int main(int argc,char *argv[])
{
        pcap_if_t *alldevs;  //define the list of the Network adapter device
        pcap_if_t *d;
        int i=0;
        char errbuf[PCAP_ERRBUF_SIZE];  //PCAP_ERRBUF_SIZE is 256
 
       /*Get the list of the device in loacal host*/
        if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf))
        {
                fprintf(stderr,"Error in pcap_findalldevs_ex",errbuf);   /
                exit(1); 
        }
        /*show the list*/
        for(d=alldevs;d;d=d->next)
        {
                printf("%d.%s\t",++i,d->name);
                if(d->description)
                {
                        printf("%s\n",d->description);
                }
                else
                {
                        printf("No description available");
                }
       }
       if(i==0)
      {
                printf("No interface found!! Make sure Winpcap is installed\n");
                return -1;
      }
        /*release the device*/
      pcap_freealldevs(alldevs);
      return 0;
}
该程序在我的电脑上正确运行,编译环境vc++6.0 ,运行结果应该是显示出你所有的网卡设备。