赞
踩
本文参考了以下文档:
http://www.winpcap.org/docs/docs_411/html/group__wpcapsamps.html
一、 软件准备
1) 下载最新版本的WinPcap安装包。地址:http://www.winpcap.org/install/default.htm
2) 下载最新版本的WinPcap开发包。地址:http://www.winpcap.org/devel.htm
3) 安装WinPcap。双击步骤1)下载的WinPcap_4_1_1.exe(这是到目前为止最新版本的WinPcap安装包),
图1
点击Next按钮,
图2
点击Next按钮,
图3
点击I Agree按钮,
图4
Automatically start the WinPcap driver at boot time这个复选框可选也可不选,然后点击Install按钮,
图5
点击Finish按钮,即安装完成。
这个安装过程主要工作是将wpcap.dll拷贝到了系统目录,比如C:/WINDOWS/system32中,并注册。
4) 解压开发包步骤2)下载的WpdPack_4_1_1.zip到一个指定的目录,比如:D:/WinPcapDevelopmentPack,解压后的目录结构如下:
图6
其中docs目录中包含了WinPcap相关文档,Examples-pcap和Examples-remote都是使用WinPcap的一些例子程序,Include目录包含的是头文件,Lib目录中包含的是库文件。
到此,准备工作完成。
二、 VC环境配置
用微软Visual C++创建一个应用,使用wpcap.dll,可按照下列步骤:
- 在每个需要使用库导出的函数(functions exported by library)的源文件开始处,包含pcap.h头文件;
- 如果程序用到了WinPcap和Win32平台呢相关的函数,记得在预处理器定义中包含WPCAP;
- 如果程序用到了WinPcap的远程抓取功能,则需要在预处理器定义中加入HAVE_REMOTE,而不要在源文件中直
接包含头文件remote-ext.h;
- 根据你的目标平台(x86 或 x64),将wpcap.lib包含到连接选项中。x86的wpcap.lib可以在WinPcap developer’s pack
的/lib目录下找到,x64的wpcap.lib可以在/lib/x64目录下找到;
下面讲述怎样设定Microsoft Visual Studio,主要详细讲解如何在Visual Studio 2010中如何配置相关环境,Visual Studio 6和Visual Studio 2005中配置情况大致如下:
Visual Studio 6
- 要增加一个预处理器定义,你必须从Project菜单中选择Settings,然后选择C/C++标签,在“Preprocessor Definitions”
对话框中添加预处理定义;
- 要在Microsoft Visual C++中一个项目添加库,首先从Project菜单中选择Settings,然后选择Link标签,并将新库
的名字加入到“Object/library modules”文本编辑框中;
- 如果要添加Visual C++搜索库的路径,从Tools菜单中选择Options,然后选择Directories标签,并在下面的Directories中增加相关路径;
Visual Studio 2005 (编译x64应用时必须为Visual Studio 2005或更高的版本)
- 要增加一个预处理器定义,你必须从Project菜单中选择Properties然后选择左边立标狂中的C/C++,再选择其下的
Preprocessor,将定义添加在右边的Preprocessor Definitions文本框中;
- 要给项目增加库,选择Project菜单中的Properties,然后选中左边列表中的Linker,在选中其下的Input,将库的名
字加入到右边的Additional Dependecies文本框中;
- 如果要添加Visual Studio搜索库的路径,从Tools菜单中选择Options,在左边的列表框内选中Project and Solutions,
再选中其下的VC++ Directories,在右边选的Show directories for 下拉框中选中Library Files,并在其下面的输入框
中加入相关路径;
- 如果要添加Visual Studio搜索的include路径,从Tools菜单中选择Options,在左边的列表框内选中Project and
Solutions,再选中其下的VC++ Directories,在右边选的Show directories for 下拉框中选中Include Files,并在其
下面的输入框中加入相关路径;
Visual Studio 2010
1) 启动Visual Studio 2010,并新建一个项目:
图7
2) 设置项目相关参数如下:
图8
选择Visual C++,选择Empty Project,项目名称为NetworkAdapterList,Solution的名称为LearnWinPcap,点击OK按钮。
3) 为项目NetworkAdapterList增加一个cpp文件,
图9
不放将该cpp的文件名称也设为NetworkAdapterList如下:
图10
点击Add按钮。
4) 如下图,点击菜单Project – NetworkAdapterList Property
图11
得到,
图12
5) 增加预处理定义WPCAP和HAVE_REMOTE。在上图中点开Configuration Properties – C/C++ - Preprocessor,选中右边的Preprocessor Definitions,再选中其右边的带向下三角形的按钮,再点击弹出的Edit下拉菜单,
图13
如下图增加WPCAP和HAVE_REMOTE,
图14
点击OK按钮,即可。
完成后的样子如下:
图15
点击应用按钮,带点击确定按钮。
WPCAP的含义只抓去本机的通讯包,HAVE_REMOTE的含义是本地机器可以抓去所在网段上其他机器的通讯包。
6) 增加库文件。如下图,选中Configuration Properties – Linker – Input – Additional Dependencies
图16
选中其右边的带向下三角形的按钮,再点击弹出的Edit下拉菜单,
图17
如上图增加了wpcap.lib和Packet.lib,点击OK按钮,
图18
点击应用按钮,再点击确定按钮。
到此,向项目添加库文件的工作也已经完成。
7) 在步骤6)中增加的库文件,以及前面提及的头文件,VC并不知道位于何处,因此要为VC增加相关搜索路径。如下图选中Configuration Properties – VC Directories – Include Directories,
图19
选中Include Directories,并如步骤5)或6)对其编辑,新增路径如下:
图20
D:/WinPcapDevelopmentPack/Include就是开发包解压后头文件所在的位置。点击OK按钮。这样头文件的搜索路径就增加完成了。
下面我们增加库文件的搜索路径。如下图选中Configuration Properties – VC Directories – Library Directories,
图21
并如步骤5)或6)对其编辑,新增路径如下:
图22
点击OK按钮,然后再点击应用按钮,确定按钮。
到此所有的配置工作已经完成
三、 第一个WinPcap应用程序
我们把D:/WinPcapDevelopmentPack/Examples-pcap/iflist下的iflist.c文件中的内容拷贝到NetworkAdapterList.cpp
中,并去掉一些相关版权说明信息。发现有很多错误,如下图所示:
图23
这是什么原因呢?原因就在pcap.h中前面几行代码,
#if defined(WIN32)
#include <pcap-stdinc.h>
#elif defined(MSDOS)
#include <sys/types.h>
#include <sys/socket.h> /* u_int, u_char etc. */
#else /* UN*X */
#include <sys/types.h>
#include <sys/time.h>
#endif /* WIN32/MSDOS/UN*X */
上面的代码是说,
1) 如果定义了WIN32宏,那么就#include <pcap-stdinc.h>,
2) 否则如果定义了MSDOS宏,那么就#include <sys/types.h>和#include <sys/socket.h>,
3) 否则,就#include <sys/types.h>和#include <sys/time.h>了
其中1)是针对Win32平台的,2)是针对DOS平台的,3)是针对UN*X平台的。
很显然我们没有在任何地方定义WIN32预处理,也没有定义MSDOS预处理,因此编译器就选择了3),而这是针对UN*X平台的,故而会出现前面样的错误。
网上有人提出这样的解决办法,即只保留上面代码中#include <pcap-stdinc.h>这一行,其他的全部删除,这样做当然可以解决上面的问题,但这样的解决方法不甚妥当。作为原则,除非万不得已,我们不要轻易修改他人提供的头文件,尤其是像WinPcap经过很多人验证过的软件包。
解决办法其实很简单,只需在NetworkAdapterList.cpp中的#ifdef _MSC_VER这一行下增加如下一行,
#define WIN32
即定义一个WIN32预处理,这样一来前面的提及的错误就全部消失了。
由于我们是在Visual Studio下面编译该程序,因此NetworkAdapterList.cpp中与MINGW32相关的代码尽可删去,最后得到的代码如下:
#ifdef _MSC_VER
#define WIN32
/*
* we do not want the warnings about the old deprecated and unsecure CRT functions
* since these examples can be compiled under *nix as well
*/
#define _CRT_SECURE_NO_WARNINGS
#endif
#include "pcap.h"
#ifndef WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#else
#include <winsock.h>
#endif
// Function prototypes
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];
/* Retrieve the device list */
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);
exit(1);
}
/* Scan the list printing every entry */
for(d=alldevs;d;d=d->next)
{
ifprint(d);
}
/* Free the device list */
pcap_freealldevs(alldevs);
return 1;
}
/* Print all the available information on the given interface */
void ifprint(pcap_if_t *d)
{
pcap_addr_t *a;
/* Name */
printf("%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 addresses */
for(a=d->addresses;a;a=a->next) {
printf("/tAddress Family: #%d/n",a->addr->sa_family);
switch(a->addr->sa_family)
{
case 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));
break;
case AF_INET6:
printf("/tAddress Family Name: AF_INET6/n");
break;
default:
printf("/tAddress Family Name: Unknown/n");
break;
}
}
printf("/n");
}
/* From tcptraceroute, convert a numeric IP address to a string */
#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 *)∈
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
return output[which];
}
编译通过,运行结果为:
图24
找到一个TP-LINK的USB无线网卡。
这说明开发环境搭建成功。
四、 从Debug到Release版本
如果如下图,将配置从Debug改为Release,你将会发现很多错误。
图25
这是因为,我们在“二、VC环境配置”所配置的全部是Debug这个Configuration,如果要想使Release配置下不出现问题,则只需按照“二、VC环境配置”所述,重新对Release配置一遍即可。
http://www.ferrisxu.com/WinPcap/html/index.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。