4.6 使用WinPcap库进行程序开发的实例

下面将详细介绍在Microsoft Visual Studio 2005环境下要如何使用WinPcap库来进行程序开发。实例程序的目的是打开本机的网络设备列表,并显示出来。下面为具体操作步骤:

(a)建立一个工程名称为devlist的空项目,放置在D:\SVN\example_lxf\devlist目录下,如图4-6所示。

4.6 使用WinPcap库进行程序开发的实例 - 图1

图 4-6 创建devlist工程

(b)添加源代码,如图4-7所示,名为main.cpp的文件的创建与图示如图4-8与图4-9所示。

4.6 使用WinPcap库进行程序开发的实例 - 图2

图 4-7 添加源代码

4.6 使用WinPcap库进行程序开发的实例 - 图3

图 4-8 创建源文件main.cpp

4.6 使用WinPcap库进行程序开发的实例 - 图4

图 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.6 使用WinPcap库进行程序开发的实例 - 图5

图 4-10 选项对话框

在[显示以下内容的目录:]下拉列表框中选择[包含文件]选项,如图4-11所示。

4.6 使用WinPcap库进行程序开发的实例 - 图6

图 4-11 选择包含文件

给包含文件添加E:\WpdPack\Include路径,如图4-12所示。

4.6 使用WinPcap库进行程序开发的实例 - 图7

图 4-12 为包含文件添加路径

在[显示以下内容的目录:]下拉列表框中选择[库文件]选项,并给库文件添加E:\WpdPack\Lib路径,如图4-13所示。

4.6 使用WinPcap库进行程序开发的实例 - 图8

图 4-13 添加Lib目录

(d)在Microsoft Visual Studio 2005下,执行[项目]→[devlist属性]菜单命令,如图4-14所示,打开设置工程属性的对话框。

4.6 使用WinPcap库进行程序开发的实例 - 图9

图 4-14 打开工程属性对话框

给[链接器]下的[输入]项中的[附加依赖项]添加工程依赖的库文件名wpcap.lib与ws2_32.lib,如图4-15所示。

4.6 使用WinPcap库进行程序开发的实例 - 图10

图 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.6 使用WinPcap库进行程序开发的实例 - 图11

图 4-16 运行对话框

单击[确定]按钮,打开DOS命令窗口,进入D:\SVN_Win\example_lxf\devlist\debug目录,如图4-17所示。

4.6 使用WinPcap库进行程序开发的实例 - 图12

图 4-17 进入可执行文件的目录

接着执行devlist.exe文件,在命令提示符后面输入devlist.exe,回车(按Enter键)即可,执行过程如图4-18所示。

4.6 使用WinPcap库进行程序开发的实例 - 图13

图 4-18 选择源类型

程序要求选择源类型,此处选择rpcap://选项,此时会列出本机网络接口的信息,结果如图4-19所示。

4.6 使用WinPcap库进行程序开发的实例 - 图14

图 4-19 本机的接口信息

直接在DOS命令行下执行ipconfig/all命令查看本机的网络接口信息,结果如图4-20所示。

4.6 使用WinPcap库进行程序开发的实例 - 图15

图 4-20 执行ipconfig/all命令后显示的结果

对比分析图4-19与图4-20所示内容可发现,两者的结果是一致的,这也就验证了我们的构建是成功的。