其实代码WpdPack里都有,我要做的是在自己学习的基础上写下自己的理解,以及一些细节应该注意的问题。
使用winpcap编程,首先下载WpdPack,然后导入include和lib目录,在工程中配置好wpcap.lib和Packet.lib,就可以使用winpcap进行编程了,具体方法网上很多,我就不罗嗦了。
这次要写的是文档的第一篇 获取设备列表
首先要明白1个结构体的定义1个winpcap函数
pcap_f_t 这是一个保存设备名字和描述的结构体链表结构,有四个成员变量,
pcap_f *next 这是一个指向pcap_f结构的指针,其实就是链表中指向下一个元
素的next,而pcap_f结构和pcap_f_t其实是一个结构 typedef struct pcap_f pcap_f_t
char *name 这个指针指向你网络适配器的名字
char *description 这个指针指向对网络适配器的详细描述
pcap_addr *address 看文档貌似是指向链表第一个元素的地址,也就是说指向
链表中第一个网络适配器的地址,这个本例中用不到,暂且不管
u_int flags 暂时用不到,不做解释
pcap_findalldevs_ex函数,定义如下
int pcap_findalldevs_ex ( char * source //用来判断是获取本地还是远程适配器,
struct pcap_rmtauth * auth, //本例用不到暂不做解释
pcap_if_t ** alldevs, //把上面pcap_f_t的结构放进去来获取网卡信息
char * errbuf //存放出错信息
)
注意两点 第一个参数char *source 如果赋值PCAP_SRC_IF_STRING则表示列出所有本地的适配器
还有第二个参数的定义是pcap_if_t ** ,注意要把第一个结构体指针的地址传进去
在进行编程前还要注意一点,找到pcap.h文件,打开它,在#include <pcap/pcap.h>这句之前加上#define HAVE_REMOTE ,否则可能会报错说上面的结构体和函数都没有定义,看到网上有人说要加入#include "remote-ext.h" ,但其实加上以后会出现#error : Please do not include this file directly. Just define HAVE_REMOTE and then include pcap.h 意思是说不要包含这个头文件,而要定义HAVE_REMOTE宏,所以按照我上面说的做就可以了。
好了,准备工作做好了,以下是代码
#include "pcap.h"
#include "stdio.h"
int main(int argc,char *argv[])
{
pcap_if_t *alldevs; //define the list of the Network adapter device
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE]; //PCAP_ERRBUF_SIZE is 256
/*Get the list of the device in loacal host*/
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf))
{
fprintf(stderr,"Error in pcap_findalldevs_ex",errbuf); /
exit(1);
}
/*show the list*/
for(d=alldevs;d;d=d->next)
{
printf("%d.%s\t",++i,d->name);
if(d->description)
{
printf("%s\n",d->description);
}
else
{
printf("No description available");
}
}
if(i==0)
{
printf("No interface found!! Make sure Winpcap is installed\n");
return -1;
}
/*release the device*/
pcap_freealldevs(alldevs);
return 0;
}
该程序在我的电脑上正确运行,编译环境vc++6.0 ,运行结果应该是显示出你所有的网卡设备。