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

本文转自http://eslxf.blog.51cto.com/918801/199155

 

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

下面详细介绍在Microsoft Visual Studio 2005下如何使用WinPcap库来进行开发,实例程序为打开本机的设备列表,并显示出来。下面为具体操作步骤:
1) 建立一个工程名称为devlist的空工程(Empty Project),如图5-6所示。
clip_image002
图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的结果,是一致的,这可以验证我们所有的构建都是成功的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值