大家好,既然我们上一节已经搭配好了环境,那么我们就开始Winpcap的学习吧。
那么第一节就带来最基础的第一步,获取设备列表,也就是获得你电脑上的网卡设备的状态,专业点讲就是获得已连接的网络适配器列表。
本节所用函数API讲解如下:
1.获取网络适配器表
int pcap_findalldevs_ex ( char * source,
struct pcap_rmtauth * auth,
pcap_if_t ** alldevs,
char * errbuf
)
这个函数的作用就是创建一个网络适配器列表。
声明一个 pcap_if_t 结构体指针。将它的地址传到该函数中,则会得到赋值。
pcap_if_t *alldevs;
调用实例
pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf);
2.释放网络适配器列表
void pcap_freealldevs ( pcap_if_t * alldevsp )
调用实例
pcap_freealldevs(alldevs);
好,接下来是实例代码,获取设备地址程序
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
int main(){
pcap_if_t * alldevs; //所有网络适配器
pcap_if_t *d; //选中的网络适配器
char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区,大小为256
int i = 0; //适配器计数变量
/**
int pcap_findalldevs_ex ( char * source,
struct pcap_rmtauth * auth,
pcap_if_t ** alldevs,
char * errbuf );
PCAP_SRC_IF_STRING代表用户想从一个本地文件开始捕获内容;
*/
//获取本地适配器列表
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf) == -1){
//结果为-1代表出现获取适配器列表失败
fprintf(stderr,"Error in pcap_findalldevs_ex:\n",errbuf);
//exit(0)代表正常退出,exit(other)为非正常退出,这个值会传给操作系统
exit(1);
}
//打印设备列表信息
/**
d = alldevs 代表赋值第一个设备,d = d->next代表切换到下一个设备
结构体 pcap_if_t:
pcap_if * next 指向下一个pcap_if,pcap_if_t和pcap_if 结构是一样的
char * name 代表适配器的名字
char * description 对适配器的描述
pcap_addr * addresses 适配器存储的地址
u_int flags 适配器接口标识符,值为PCAP_IF_LOOPBACK
*/
for(d = alldevs;d !=NULL;d = d->next){
printf("number:%d name:%s",++i,d->name);
if(d->description){
//打印适配器的描述信息
printf("description:%s\n",d->description);
}else{
//适配器不存在描述信息
printf("description:%s","no description\n");
}
printf("flags:%s\n",d->flags);
}
//i为0代表上述循环未进入,即没有找到适配器,可能的原因为Winpcap没有安装导致未扫描到
if(i == 0){
printf("interface not found,please check winpcap installation");
}
//释放网络适配器列表
pcap_freealldevs(alldevs);
return 0;
}
由于各个编译器不一,或者Winpcap的版本不同,可能报的错误不一。
可能报的错误:
- 'PCAP_SRC_IF_STRING' undeclared (first use in this function)
则可以添加一个头文件remote-ext.h ,即#include "remote-ext.h"(记住这条语句要放在#include “pcap.h”之后,否则会出错!)
- error: #error Please do not include this file directly. Just define HAVE_REMOTE and then include pcap.h
则将#include "remote-ext.h"语句换成#define HAVE_REMOTE即可
运行结果:
1. rpcap://\Device\NPF_{5AC72F8D-019C-4003-B51B-7ABB67AF392A} (Network adapter 'Microsoft' on local host)
2. rpcap://\Device\NPF_{C17EB3F6-1E86-40E5-8790-AC2518B74D05} (Network adapter 'Microsoft' on local host)
3. rpcap://\Device\NPF_{33E23A2F-F791-409B-8452-A3FB5A78B73E} (Network adapter 'Qualcomm Atheros Ar81xx series PCI-E Ethernet Controller' on local host)
4. rpcap://\Device\NPF_{DCCF036F-A9A8-4225-B980-D3A3F0575F5B} (Network adapter 'Microsoft' on local host)
5. rpcap://\Device\NPF_{D62A0060-F424-46FC-83A5-3394081685FD} (Network adapter 'Microsoft' on local host)
6. rpcap://\Device\NPF_{B5224A53-8450-4537-AB3B-9869158121CD} (Network adapter 'Microsoft' on local host)
好啦,获取本地设备列表详情就是这么简单,有问题请评论,我会及时回复的