1.6. 使用WinPcap库进行程序开发

下面详细介绍在Microsoft Visual Studio 2005下如何使用WinPcap库来进行开发,实例程序为打开本机的设备列表,并显示出来。下面为具体操作步骤:
1) 建立一个工程名称为devlist的空工程(Empty Project),如图5-6所示。
clip_p_w_picpath002
图5-6 创建devlist 工程
2) 添加源代码,文件名为main.cpp,如图5-7、图5-8与图5-9所示。
clip_p_w_picpath004
图5-7 添加源代码
clip_p_w_picpath006
图5-8 创建源文件main.cpp
clip_p_w_picpath008
图5-9 源文件main.cpp 图示

源代码main.cpp 文件内容如下所示:

#define WIN32

#define HAVE_REMOTE

 

#include <stdio.h>

#include "pcap.h"

#include <winsock.h>

 

//函数原形

void ifprint(pcap_if_t *d);

char *iptos(u_long in);

 

int main()

{

  pcap_if_t *alldevs;

  pcap_if_t *d;

  char errbuf[PCAP_ERRBUF_SIZE+1];

  char source[PCAP_ERRBUF_SIZE+1];

 

  /*选择要获取设备列表的源*/

  printf("Enter the device you want to list:\n"

        "rpcap://              ==> lists interfaces in the local machine\n"

        "rpcap://hostname:port ==> lists interfaces in a remote machine\n"

        "                          (rpcapd daemon must be up and running\n"

        "                           and it must accept 'null' authentication)\n"

        "file://foldername     ==> lists all pcap files in the give folder\n\n"

"Enter your choice: " );

 

  fgets(source, PCAP_ERRBUF_SIZE, stdin);

  source[PCAP_ERRBUF_SIZE] = '\0';

 

  /*获取接口列表*/

  if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1)

  {

    fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);

    exit(1);

  }

 

  /*遍历列表,打印出每个条目的信息*/

  for(d=alldevs;d;d=d->next)

  {

    ifprint(d);

  }

  /*释放接口列表*/

  pcap_freealldevs(alldevs);

 

  return 1;

}

 

/* 打印给定接口的所有有效信息*/

void ifprint(pcap_if_t *d)

{

  pcap_addr_t *a;

  char ip6str[128];

 

  /*名称(Name)*/

  printf("\tName:%s\n",d->name);

 

  /*描述(Description)*/

  if (d->description)

    printf("\tDescription: %s\n",d->description);

 

  /*回环地址(Loopback Address)*/

  printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");

 

  /*IP地址(IP addresses)*/

  for(a=d->addresses;a;a=a->next) {

    printf("\tAddress Family: #%d\n",a->addr->sa_family);

 

    if(a->addr->sa_family==AF_INET)

    {

        printf("\tAddress Family Name: AF_INET\n");

        if (a->addr)

          printf("\tAddress: %s\n",

iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));

        if (a->netmask)

          printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));

        if (a->broadaddr)

          printf("\tBroadcast Address: %s\n",

iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));

        if (a->dstaddr)

          printf("\tDestination Address: %s\n",

iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));

    }else

    {

        printf("\tAddress Family Name: Unknown\n");

    }

  }

  printf("\n");

}

 

/*把一个数字IP地址转换为一个字符串*/

#define IPTOSBUFFERS    12

char *iptos(u_long in)

{

    static char output[IPTOSBUFFERS][3*4+3+1];

    static short which;

    u_char *p;

 

    p = (u_char *)&in;

    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);

    _snprintf_s(output[which], sizeof(output[which]),

 sizeof(output[which]),"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);

    return output[which];

}

 

 
3) 配置构建所需的Include文件与库文件
参见图5-10、图5-11、图5-12与图5-13所示,配置构建所需的Include文件与库文件。给Include files添加了F:\WpdPack\Include路径,为所需的头文件。给Library files添加F:\WpdPack\Lib路径,为所需的库文件。
在Microsoft Visual Studio 2005下,点击菜单[Tools]的菜单项[Options...]打开如图5-10的对话框。
clip_p_w_picpath010
图5-10 打开Tools-&gt;Options... 弹出的对话框
选择Show directories for:为Include files选项,如图5-11所示。
clip_p_w_picpath012
图5-11 选择Include files
给Include files添加F:\WpdPack\Include路径,如图5-12所示。
clip_p_w_picpath014
图5-12 添加Include目录
选择Show directories for:为Library files选项,给Library files添加F:\WpdPack\Lib路径,如图5-13所示。
clip_p_w_picpath016
图5-13 添加Lib目录
4) 设置工程属性
在Microsoft Visual Studio 2005下,点击菜单[Project]的菜单项[Properties]打开如图5-14的设置工程属性的对话框。给Linker-&gt;Input-&gt;Additional Dependencies添加工程依赖的库文件名wpcap.lib与ws2_32.lib,如图5-15所示。
clip_p_w_picpath018
图5-14 打开工程属性对话框
clip_p_w_picpath020
图5-15 设置工程所依赖的库文件名
ws2_32.lib库文件包含了Windows的一些socket函数。本文的示例程序需要它。
5) 构建工程
选择Debug配置,开始构建,在Microsoft Visual Studio 2005中选择菜单[Build]执行菜单项[Build devlist],执行结果如下:

 

1>------ Build started: Project: devlist, Configuration: Debug Win32 ------

1>Compiling...

1>main.cpp

1>Linking...

1>Embedding manifest...

1>Build log was saved at

 "file://d:\SVN_Win\example_lxf\devlist\devlist\Debug\BuildLog.htm"

1>devlist - 0 error(s), 0 warning(s)

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

构建成功,在D:\SVN_Win\example_lxf\devlist\debug目录下生成devlist.exe文件。
6) 执行程序
进入D:\SVN_Win\example_lxf\devlist\debug目录执行devlist.exe文件。
clip_p_w_picpath022
图5-16 选择源类型
程序要求选择源类型,此处我们选择rpcap://选项将列出本机网络接口的信息,结果如图5-17所示。
clip_p_w_picpath024
图5-17 本机的接口信息
我们可以直接在DOS命令行下执行ipconfig /all命令查看本机的网络接口信息,结果如图5-18所示。
clip_p_w_picpath026
图5-18 本机执行ipconfig /all显示的结果
对比分析图5-17与图5-18的结果,是一致的,这可以验证我们所有的构建都是成功的。

本文出自 “千江月” 博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/199155