WinPcap编程——用winpcap写的第一个程序
标签:
winpcap编译数据包网络适配器vc环境设置 |
分类: C/C /VC |
因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。对于初学者来说,不太好做的可能是编译程序之前应该做什么事。我就大体说一下我的过程。
首先先大体介绍下Winpcap。
winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:
1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;
2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;
3> 在网络上发送原始的数据包;
4> 收集网络通信过程中的统计信息。
具体介绍参见http://baike.baidu.com/view/696423.htm 这里有Winpcap的详细介绍。
下面说一下你在编译Winpcap之前要做的事情。
1 下载Winpcap安装包,地址http://www.winpcap.org/install/default.htm。
2 然后到
3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。
然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。
首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。在里面填写如下代码:
#include <pcap.h>
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,注意和前面的要有空格隔开。
然后编译,链接。
运行结果如下
和Winpcap documentation里面的例子不同,它那里用的函数是pcap_findalldevs_ex(),这个函数的参数有四个,这两个函数的定义及参数问题,在帮助文档上都很详细,这里也不说了。要是用这个函数的话,编译时会有错误,说pcap_findalldevs_ex()未定义,为什么呢?因为我们这里头文件只包含了winpcap.h,在这个头文件里,你会发现并没有pcap_findalldevs_ex()这个函数的定义,而只有pcap_findalldevs()的定义。那么怎么办呢?两个方法,一,在#include <pcap.h>前面加上一个预处理程序定义#define HAVE_REMOTE。二,直接加上#include <remote_ext.h>,因为在这个文件里有pcap_findalldevs_ex()的函数定义。其实第一种方法也就变相的调用remote_ext.h这个文件,其过程大家可以在pcap.h中找到。

加载中…