Visual Studio 2005 Express 下的 WinPcap 配置
1、安装 Visual Studio 2005 Express Edition 和 Paltform SDK。 如 何安装Visual Studio 2005 Express在这里就不赘述了,很简单的。由于VC Express没有自带 Platform SDK,所以需要自己下载安装(如果不安装 psdk的话,就会出现 找不到 winsock2.h 的编译错误)。由于微软现在官网提供的psdk下载比较麻烦,需要windows正版验证,再加上体积比较大,所以我这里就不用,我用的psdk是在这里 下载的: XPSP2 PSDK Full Download with Local Install 还有一个,不知道能不能安装在xp上,有兴趣的兄弟可以自己试试 Windows Server 2003 PSDK Full Download with Local Install 似乎这两个链接在官网上是找不到的 下载、解压、安装,然后再配置 VC++: tools --> options --> Projects and Solutions --> VC++ Directories : 把以下路径添加到相应的下拉节点中去:(其中psdk是你的sdk安装目录)
安装后按要求重启,如果没安装这个包,程序即使编译成功也不能运行,会提示找不到 winpcap.dll 3、下载 WinPcap Developer's Packs 解压后会得一个目录WpdPack四个子目录: docs Examples-pcap Examples-remote Include Lib 然后配置VC++ tools --> options --> Projects and Solutions --> VC++ Directories :
4、新建一个 win32->win32 console application 工程,然后配置工程属性:
#include "pcap.h" #include "remote-ext.h" int main() { pcap_if_t *alldevs; pcap_if_t *d; int i=0; char errbuf[PCAP_ERRBUF_SIZE]; /* Retrieve the device list from the local machine */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs_ex: %s/n", errbuf); exit(1); } /* Print the list */ 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; } /* We don't need any more the device list. Free it */ pcap_freealldevs(alldevs); return 0; } 6、链接错误:
anothertest.obj : error LNK2019: unresolved external symbol __imp__WSASetLastError@
4
referenced
in
function _WspiapiGetNameInfo@
28
解决该问题,需要只需把ws2_32.lib添加到wpcap.lib Packet.lib后面(见上面第4条)
anothertest.obj : error LNK2019: unresolved external symbol __imp__inet_ntoa@ 4 referenced in function _WspiapiLegacyGetAddrInfo@ 16 anothertest.obj : error LNK2019: unresolved external symbol __imp__htonl@ 4 referenced in function _WspiapiLegacyGetAddrInfo@ 16 anothertest.obj : error LNK2019: unresolved external symbol __imp__getservbyname@ 8 referenced in function _WspiapiLegacyGetAddrInfo@ 16 anothertest.obj : error LNK2019: unresolved external symbol __imp__htons@ 4 referenced in function _WspiapiLegacyGetAddrInfo@ 16 anothertest.obj : error LNK2019: unresolved external symbol __imp__inet_addr@ 4 referenced in function _WspiapiParseV4Address@ 8 anothertest.obj : error LNK2019: unresolved external symbol __imp__WSAGetLastError@ 0 referenced in function _WspiapiQueryDNS@ 24 anothertest.obj : error LNK2019: unresolved external symbol __imp__gethostbyname@ 4 referenced in function _WspiapiQueryDNS@ 24 anothertest.obj : error LNK2019: unresolved external symbol __imp__gethostbyaddr@ 12 referenced in function _WspiapiLegacyGetNameInfo@ 28 anothertest.obj : error LNK2019: unresolved external symbol __imp__getservbyport@ 8 referenced in function _WspiapiLegacyGetNameInfo@ 28 anothertest.obj : error LNK2019: unresolved external symbol __imp__ntohs@ 4 referenced in function _WspiapiLegacyGetNameInfo@ 28 ----------------------------------------------------------- 网络编程学习日记(1)_WinPcap和VC的配置
2008-08-21 13:34
-=------------------------------------------------------- 测试成功的代码: #pragma comment(lib,"wpcap.lib") ------------------------------------------------ 说明:WinPcap共有安装程序和开发包 静态链接库目录(Lib)
1.运行WinPcap 程序,出现"无法找到组件"对话框错误:
解决方法:安装WinPcap
2.在VC6.0中编译WinPcap程序,出现下面错误:
解决方法: 目录中的Lib目录 4.Build 基于WinPcap的应用程序,出现链接错误: Linking...
解决方法: wpcap.lib 前面有空格 http://blog.csdn.net/zhangyang0402/archive/2009/01/15/3789718.aspx --------------------------------------------------------------------------------------------- 在winpcap3.1beta4的文档中 有个获取设备列表的例子程序 其中使用到了pcap_findalldevs_ex()函数,在文档中是这样介绍这个函数的: This function is a superset of the old 'pcap_findalldevs()', which is obsolete, and which allows listing only the devices present on the local machine. Vice versa, pcap_findalldevs_ex() allows listing the devices present on a remote machine as well. 简单说pcap_findalldevs_ex()是pcap_findalldevs()的一个超集, 他不仅可以获取本地的设备列表,还可以获取远程计算机的社别列表,但是在将pcap_findalldevs()换成 pcap_findalldevs_ex()的过程中却出现了意想不到的错误
#include
<
cstdlib
>
#include < iostream > #include < pcap.h > using namespace std; int main( int argc, char * argv[]) { pcap_if_t * alldevs; pcap_if_t * d; int i = 0 ; char errbuf[PCAP_ERRBUF_SIZE]; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL, & alldevs,errbuf) == 0 ){ while ( ! (alldevs == NULL)){ cout << " 设备 " << i << " 的名称 " << (alldevs -> name) << endl; cout << " 设备 " << i << " 的描述 " << (alldevs -> description) << endl; alldevs = alldevs -> next; i ++ ; } } system( " PAUSE " ); return EXIT_SUCCESS; } 使用dev c++编译,出现以下错误 F:/IT学习/c++/301/main.cpp In function `int main(int, char**)': 在网上查了一下,有人说这是wincap的一个失误,忘记把该函数的声明文件包含进去了 我打开pcap.h看了一下,确实没有pcap_findalldevs_ex函数的声明 不死心 找个文本搜索工具,在dev c++的include文件夹中搜索pcap_findalldevs_ex,[在此之前我已经把wincap的头文件全部拷入了该目录,呵呵,有些.....] 结果真让我查到了,该函数的名称在remote-ext.h找到了 我看了一下,嘿嘿,就是他了 该代码,包含该文件
#include
<
cstdlib
>
#include < iostream > #include < pcap.h > #include <remote-ext.h> using namespace std; int main( int argc, char * argv[]) { pcap_if_t * alldevs; pcap_if_t * d; int i = 0 ; char errbuf[PCAP_ERRBUF_SIZE]; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL, & alldevs,errbuf) == 0 ){ while ( ! (alldevs == NULL)){ cout << " 设备 " << i << " 的名称 " << (alldevs -> name) << endl; cout << " 设备 " << i << " 的描述 " << (alldevs -> description) << endl; alldevs = alldevs -> next; i ++ ; } } system( " PAUSE " ); return EXIT_SUCCESS; } 再次编译,竟然还有错误 F:/IT学习/c++/301/main.o(.text+0x15b) In function `main': 想起来了,使用dev c++的时候常遇到的问题 加载dll 打开工程选项->参数->连接器->加入库或者对象 找到wpcap.lib,确定 然后再编译,通过 这是我机器上的运行结果 设备0的名称rpcap:///Device/NPF_GenericNdisWanAdapter 呵呵,有些乱啊 好在通过了 现在看来,如果使用不到pcap_findalldevs_ex的高级特性的化 仅仅是想获取一下设备列表的话 还是使用原先的pcap_findalldevs()函数吧 简单易用,相信也不会发生这样的错误 呵呵 当然,这只是测试代码 http://blog.csdn.net/bingdian37/archive/2006/08/07/1034873.aspx
转自:http://hi.baidu.com/kuangxiangjie/blog/item/19e2c23f7505a7ca7c1e7160.html |