4.6 使用WinPcap库进行程序开发的实例
下面将详细介绍在Microsoft Visual Studio 2005环境下要如何使用WinPcap库来进行程序开发。实例程序的目的是打开本机的网络设备列表,并显示出来。下面为具体操作步骤:
(a)建立一个工程名称为devlist的空项目,放置在D:\SVN\example_lxf\devlist目录下,如图4-6所示。
图 4-6 创建devlist工程
(b)添加源代码,如图4-7所示,名为main.cpp的文件的创建与图示如图4-8与图4-9所示。
图 4-7 添加源代码
图 4-8 创建源文件main.cpp
图 4-9 源文件main.cpp的图示
main.cpp文件的源代码如下:
defne WIN32
defne HAVE_REMOTE
include<stdio.h>
include"pcap.h"
include<winsock.h>
/打印给定接口的所有有效信息/
void ifprint(pcap_if_t*d);
/把一个数字IP地址转换为一个字符串/
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"
"fle://foldername==>lists all pcap fles in the give folder\n\n"
"Enter your choice:");
fgets(source,PCAP_ERRBUF_SIZE,stdin);
source[PCAP_ERRBUF_SIZE]='\0';
/获取接口列表/
if(pcap_fndalldevs_ex(source,NULL,&alldevs,errbuf)==-1)
{
fprintf(stderr,"Error in pcap_fndalldevs:%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->fags&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");
}
defne 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];
}
(c)配置构建所需的头文件与库文件。给包含文件添加E:\WpdPack\Include路径,为所需的WinPcap头文件指定路径。给库文件添加E:\WpdPack\Lib路径,为所需的WinPcap库文件指定路径。具体操作步骤如下。
在Microsoft Visual Studio 2005下,执行[工具]→[选项…]菜单命令,弹出如图4-10所示的对话框。
图 4-10 选项对话框
在[显示以下内容的目录:]下拉列表框中选择[包含文件]选项,如图4-11所示。
图 4-11 选择包含文件
给包含文件添加E:\WpdPack\Include路径,如图4-12所示。
图 4-12 为包含文件添加路径
在[显示以下内容的目录:]下拉列表框中选择[库文件]选项,并给库文件添加E:\WpdPack\Lib路径,如图4-13所示。
图 4-13 添加Lib目录
(d)在Microsoft Visual Studio 2005下,执行[项目]→[devlist属性]菜单命令,如图4-14所示,打开设置工程属性的对话框。
图 4-14 打开工程属性对话框
给[链接器]下的[输入]项中的[附加依赖项]添加工程依赖的库文件名wpcap.lib与ws2_32.lib,如图4-15所示。
图 4-15 设置工程所依赖的库文件名
ws2_32.lib库文件包含了Windows的一些socket函数,这些都是实例程序需要的。
注意此处选择的是Debug配置,如果选择的是Release配置,同样需要设置正确的工程属性。
(e)选择Debug配置,开始构建工程,在Microsoft Visual Studio 2005中执行[生成]→[生成devlist]菜单命令,执行结果如下:
1>———Build started:Project:devlist,Confguration:Debug Win32———
1>Compiling…
1>main.cpp
1>Linking…
1>Embedding manifest…
1>Build log was saved at
"fle://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文件。
(f)在[开始]菜单中执行[运行…]菜单命令,在弹出的对话框中输入cmd命令,如图4-16所示。
图 4-16 运行对话框
单击[确定]按钮,打开DOS命令窗口,进入D:\SVN_Win\example_lxf\devlist\debug目录,如图4-17所示。
图 4-17 进入可执行文件的目录
接着执行devlist.exe文件,在命令提示符后面输入devlist.exe,回车(按Enter键)即可,执行过程如图4-18所示。
图 4-18 选择源类型
程序要求选择源类型,此处选择rpcap://选项,此时会列出本机网络接口的信息,结果如图4-19所示。
图 4-19 本机的接口信息
直接在DOS命令行下执行ipconfig/all命令查看本机的网络接口信息,结果如图4-20所示。
图 4-20 执行ipconfig/all命令后显示的结果
对比分析图4-19与图4-20所示内容可发现,两者的结果是一致的,这也就验证了我们的构建是成功的。