深度剖析WinPcap之(五)――在Visual studio 2005中使用WinPcap库进行程序开发(2)

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

下面详细介绍在Microsoft Visual Studio 2005下如何使用WinPcap库来进行开发,实例程序为打开本机的设备列表,并显示出来。下面为具体操作步骤:
1) 建立一个工程名称为devlist的空工程(Empty Project),如图5-6所示。
深度剖析WinPcap之(五)――在Visual studio 2005中使用WinPcap库进行程序开发(2)_第1张图片
图5-6 创建devlist 工程
2) 添加源代码,文件名为main.cpp,如图5-7、图5-8与图5-9所示。
clip_image004
图5-7 添加源代码
clip_image006
图5-8 创建源文件main.cpp
clip_image008
图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_image010
图5-10 打开Tools-&gt;Options... 弹出的对话框
选择Show directories for:为Include files选项,如图5-11所示。
clip_image012
图5-11 选择Include files
给Include files添加F:\WpdPack\Include路径,如图5-12所示。
clip_image014
图5-12 添加Include目录
选择Show directories for:为Library files选项,给Library files添加F:\WpdPack\Lib路径,如图5-13所示。
clip_image016
图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_image018
图5-14 打开工程属性对话框
clip_image020
图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_image022
图5-16 选择源类型
程序要求选择源类型,此处我们选择rpcap://选项将列出本机网络接口的信息,结果如图5-17所示。
clip_image024
图5-17 本机的接口信息
我们可以直接在DOS命令行下执行ipconfig /all命令查看本机的网络接口信息,结果如图5-18所示。
clip_image026
图5-18 本机执行ipconfig /all显示的结果
对比分析图5-17与图5-18的结果,是一致的,这可以验证我们所有的构建都是成功的。

你可能感兴趣的:(程序,深度,Visual,Studio,winpcap)