Winpcap网络编程五之Winpcap学习教程,获取设备列表

大家好,既然我们上一节已经搭配好了环境,那么我们就开始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)

好啦,获取本地设备列表详情就是这么简单,有问题请评论,我会及时回复的




你可能感兴趣的:(网络,网卡,winpcap,设备列表)