本文转自http://eslxf.blog.51cto.com/918801/199155
1.6. 使用WinPcap库进行程序开发
下面详细介绍在Microsoft Visual Studio 2005下如何使用WinPcap库来进行开发,实例程序为打开本机的设备列表,并显示出来。下面为具体操作步骤:
1) 建立一个工程名称为devlist的空工程(Empty Project),如图5-6所示。
图5-6 创建devlist工程
2) 添加源代码,文件名为main.cpp,如图5-7、图5-8与图5-9所示。
图5-7添加源代码
图5-8 创建源文件main.cpp
图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 *)∈
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的对话框。
图5-10 打开Tools->Options...弹出的对话框
选择Show directories for:为Include files选项,如图5-11所示。
图5-11 选择Include files
给Include files添加F:/WpdPack/Include路径,如图5-12所示。
图5-12 添加Include目录
选择Show directories for:为Library files选项,给Library files添加F:/WpdPack/Lib路径,如图5-13所示。
图5-13 添加Lib目录
4) 设置工程属性
在Microsoft Visual Studio 2005下,点击菜单[Project]的菜单项[Properties]打开如图5-14的设置工程属性的对话框。给Linker->Input->Additional Dependencies添加工程依赖的库文件名wpcap.lib与ws2_32.lib,如图5-15所示。
图5-14 打开工程属性对话框
图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文件。
图5-16 选择源类型
程序要求选择源类型,此处我们选择rpcap://选项将列出本机网络接口的信息,结果如图5-17所示。
图5-17 本机的接口信息
我们可以直接在DOS命令行下执行ipconfig /all命令查看本机的网络接口信息,结果如图5-18所示。
图5-18 本机执行ipconfig /all显示的结果
对比分析图5-17与图5-18的结果,是一致的,这可以验证我们所有的构建都是成功的。