WINPCAP编程环境设置

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。对于初学者来说,不太好做的可能是编译程序之前应该做什么事。我就大体说一下我的过程。

首先先大体介绍下Winpcap。

winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:

1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;

2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;

3> 在网络上发送原始的数据包;

4> 收集网络通信过程中的统计信息。

具体介绍参见/view/696423.htm这里有Winpcap的详细介绍。

下面说一下你在编译Winpcap之前要做的事情。

1 下载Winpcap安装包,地址/install/default.htm。

2 然后到/devel.htm下载WinPcap developer's pack包,解压,里面有配置好的例子和include library。

3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。

然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。

首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。在里面填写如下代码:

#include

main( )

pcap_if_t *alldevs;

pcap_if_t *d;

int i=0;

char errbuf[PCAP_ERRBUF_SIZE];

if (pcap_findalldevs(&alldevs, errbuf) == -1)

{

fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1);

}

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

{

printf("%d. %s", ++i, d->name);

if (d->description)

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

else

printf(" (No description available)\n");

}

if (i == 0)

{

printf("\nNo interfaces found! Make sure WinPcap is installed.\n");

return -1;

}

pcap_freealldevs(alldevs);

return 0;

}

运行之前我们要手动给它添加一个动态链接库wpcap.lib,方法是在菜单Project中点Settings,然后在选项中选Link,在library modules 后面填上wpcap.lib,注意和前面的要有空格隔开。

然后编译,链接。

运行结果如下

正是我电脑的网卡信息,其中第一个现在我还没弄明白是什么,第二是我的无线网卡,第三是我现在正在用它上网的Realtek以太网卡。

关于这个程序的一些函数和变量的解释,大家可以看看Winpcap documentation,里面介绍的很详细,这里就不分析了。

PS:细心的人会发现,这里用来获取网络适配器信息的函数为pcap_findalldevs(),

和Winpcap documentation里面的例子不同,它那里用的函数是pcap_findalldevs_ex(),这个函数的参数有四个,这两个函数的定义及参数问题,在帮助文档上都很详细,这里也不说了。要是用这个函数的话,编译时会有错误,说pcap_findalldevs_ex()未定义,为什么呢?因为我们这里头文件只包含了winpcap.h,在这个头文件里,你会发现并没有

pcap_findalldevs_ex()这个函数的定义,而只有pcap_findalldevs()的定义。那么怎么办呢?两个方法,一,在#include 前面加上一个预处理程序定义#define

HAVE_REMOTE。二,直接加上#include ,因为在这个文件里有

pcap_findalldevs_ex()的函数定义。其实第一种方法也就变相的调用remote_ext.h这个文件,其过程大家可以在pcap.h中找到。

PS2:为什么前面已经设置了路径了,函数编译的时候为什么还的手动添加动态链接库?因为这个路径只是告诉它在哪里找,也就是说,只是个路径提示。就像include 一样,它也是在Directories设置的include文件中的,但是我们在程序的开头还的包括这个头文件,这个道理是一样的。

ps3: 发现上面的运行结果的图给贴错了,这个图是我禁用无线网络后运行的,所以没有打印出无线网卡的信息,只是有两个,第一个根据老师的介绍是计算机的拨号和VPN(虚拟专用网)的网络接口(俗称的“猫”),第二个是以太网卡。

1.在VC 6.0中[工具]->[选择]->[目录]分别把解压包里的inlude和library加进去。

2.在VC 6.0中[工程]->[Link]中加wpcap.lib Packet.lib或在源文件中加入

#pragma comment(lib, "wpcap.lib")

#pragma comment(lib, "Packet.lib")。

3.若要在程序中使用套接字,还须加#pragma comment(lib, "wsock32.lib")。

二列举网卡及对应的网络地址和子网掩码

#include "pcap.h"

相关文档
最新文档