获取本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息及网线是否插入状态

2023-05-16

使用windows sdk提供的API函数GetAdaptersInfo()可以获得本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息,并用IP_ADAPTER_INFO结构体存储,使用GetIfEntry()获取网卡的状态,可有效判断出网卡通讯是否正常,是否插入网线等状态......

关于本文更为详细的说明及代码示例详见:http://download.csdn.net/detail/lusirking/9562517

判断网线是否插入

可利用IPHELPAPI中的GetIfEntry()进行获取,代码如下:

bool getAdapterState(DWORD index)
{
MIB_IFROW Info ;    // 存放获取到的Adapter参数
memset(&Info ,0 ,sizeof(MIB_IFROW)) ; 
Info.dwIndex = index ; // dwIndex是需要获取的Adapter的索引,可以通过GetAdaptersInfo和其他相关函数获取
if(GetIfEntry(&Info) != NOERROR)
{
printf("ErrorCode = %d\n" ,GetLastError());
return false;
}
if(Info.dwOperStatus == IF_OPER_STATUS_NON_OPERATIONAL

                || Info.dwOperStatus == IF_OPER_STATUS_UNREACHABLE
                || Info.dwOperStatus == IF_OPER_STATUS_DISCONNECTED 

                || Info.dwOperStatus == IF_OPER_STATUS_CONNECTING)
return false;
else if(Info.dwOperStatus == IF_OPER_STATUS_OPERATIONAL

                  || Info.dwOperStatus == IF_OPER_STATUS_CONNECTED)
return true;
}

MIB_IFROW  介绍:

MIB_IFROW  中有一项 dwOperStatus的参数,它表明当前接口的操作状态

其值如下:

1)IF_OPER_STATUS_NON_OPERATIONAL

LANadapter has been disabled, for example because of an address conflict.

局域网适配器禁用,例如地址冲突

2)IF_OPER_STATUS_UNREACHABLE

WANadapter that is not connected.

WAN适配器未连接

3)IF_OPER_STATUS_DISCONNECTED

ForLAN adapters: network cable disconnected. For WAN adapters: no carrier

局域网适配器:网线未插入。WAN适配器:无信号

4)IF_OPER_STATUS_CONNECTING

WANadapter that is in the process of connecting.

正在处理连接

5)IF_OPER_STATUS_CONNECTED

WANadapter that is connected to a remote peer.

 已连接远端

6)IF_OPER_STATUS_OPERATIONAL

Defaultstatus for LAN adapters 默认状态

经测试

拔下网线时,dwOperStatus值为IF_OPER_STATUS_NON_OPERATIONAL

连接网线时,dwOperStatus 值为IF_OPER_STATUS_OPERATIONAL


IP_ADAPTER_INFO结构体描述如下:

typedef struct _IP_ADAPTER_INFO

{

  struct _IP_ADAPTER_INFO* Next;//指向链表中下一个适配器信息的指针

  DWORD ComboIndex;//预留值

  char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//使用ANSI字符串表示的适配器名称

  char Description[MAX_ADAPTER_DESCRIPTION_LENGTH +4];//使用ANSI字符串表示的适配器描述

  UINT AddressLength;//适配器硬件地址以字节计算的长度

  BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];//硬件地址以BYTE数组所表示

  DWORD Index;//适配器索引

    UINT Type;//适配器类型,主要有以下几种:

    /*

     *   MIB_IF_TYPE_OTHER     1

     *   MIB_IF_TYPE_ETHERNET     6

     *   MIB_IF_TYPE_TOKENRING     9

     *   MIB_IF_TYPE_FDDI     15

     *   MIB_IF_TYPE_PPP     23

     *   MIB_IF_TYPE_LOOPBACK      24

     *   MIB_IF_TYPE_SLIP      28

     */

  UINT DhcpEnabled;//指定这个适配器是否开启DHCP

  PIP_ADDR_STRING CurrentIpAddress;//预留值

  IP_ADDR_STRING IpAddressList;//该适配器的IPv4地址链表

  IP_ADDR_STRING GatewayList;//该适配器的网关IPv4地址链表

  IP_ADDR_STRING DhcpServer;//该适配器的DHCP服务器的IPv4 地址链表

  BOOL HaveWins;

  IP_ADDR_STRING PrimaryWinsServer;

  IP_ADDR_STRING SecondaryWinsServer;

  time_t LeaseObtained;

  time_t LeaseExpires;

} IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;

由于可能有多个网卡,因此struct _IP_ADAPTER_INFO* Next字段为一个链表结构指针,由于一个网卡可能有多个IP,因此IP_ADDR_STRING字段应该也是一个链表结构,其信息如下所示:

typedef struct_IP_ADDR_STRING

{

    struct _IP_ADDR_STRING* Next;  //指向同类型节点,即下一个IP(如果有多IP的话)

    IP_ADDRESS_STRING IpAddress;  //IP地址信息

    IP_MASK_STRING IpMask; //IP子网掩码

    DWORD Context;// 网络表入口。这个值对应着AddIPAddredd和DeleteIPAddress函数中的NTEContext参数

} IP_ADDR_STRING;

IP_ADDR_STRING结构也是一个链表节点

综上所述,用下图来描述网卡的结构存储信息,也许更明朗:


获取网卡信息的代码如下:

#include <WinSock2.h>
#include <Iphlpapi.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
int __cdecl main()
{
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
PIP_ADAPTER_INFO pAdapter = NULL;
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
//记录网卡数量
int netCardNum = 0;
//记录每张网卡上的IP地址数量
int IPnumPerNetCard = 0;
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);    
}
if (ERROR_SUCCESS == nRel)
{
//输出网卡信息
//可能有多网卡,因此通过循环去判断
pAdapter = pIpAdapterInfo;
while (pAdapter)
{
cout<<"网卡数量:"<<++netCardNum<<endl;
cout<<"网卡名称:"<<pAdapter->AdapterName<<endl;
cout<<"网卡描述:"<<pAdapter->Description<<endl;
switch(pAdapter->Type)
{
case MIB_IF_TYPE_OTHER:
cout<<"网卡类型:"<<"OTHER"<<endl;
break;
case MIB_IF_TYPE_ETHERNET:
cout<<"网卡类型:"<<"ETHERNET"<<endl;
break;
case MIB_IF_TYPE_TOKENRING:
cout<<"网卡类型:"<<"TOKENRING"<<endl;
break;
case MIB_IF_TYPE_FDDI:
cout<<"网卡类型:"<<"FDDI"<<endl;
break;
case MIB_IF_TYPE_PPP:
printf("PP\n");
cout<<"网卡类型:"<<"PPP"<<endl;
break;
case MIB_IF_TYPE_LOOPBACK:
cout<<"网卡类型:"<<"LOOPBACK"<<endl;
break;
case MIB_IF_TYPE_SLIP:
cout<<"网卡类型:"<<"SLIP"<<endl;
break;
default:
break;
}
cout<<"网卡MAC地址:";
for (DWORD i = 0; i < pAdapter->AddressLength; i++)
if (i < pAdapter->AddressLength-1)
{
printf("%02X-", pAdapter->Address[i]);
}
else
{
printf("%02X\n", pAdapter->Address[i]);
}
cout<<"网卡IP地址如下:"<<endl;
//可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString =&(pAdapter->IpAddressList);
IPnumPerNetCard = 0;
do 
{
cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
cout<<"网关地址:"<<pAdapter->GatewayList.IpAddress.String<<endl;
pIpAddrString=pIpAddrString->Next;
} while (pIpAddrString);
if(getAdapterState(pAdapter->Index))
cout<<"网卡工作正常"<<endl;
else
cout<<"网卡工作异常"<<endl;
pAdapter = pAdapter->Next;
cout<<"--------------------------------------------------------------------"<<endl;
}
}
//释放内存空间
if (pIpAdapterInfo)
{
delete []pIpAdapterInfo;
pIpAdapterInfo=NULL;
}
return 0;
}

运行界面如下:


关于本文更为详细的说明及代码示例详见:http://download.csdn.net/detail/lusirking/9562517

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息及网线是否插入状态 的相关文章

  • PX4-terrain_estimator

    by luoshi006 参考 xff1a https github com PX4 Firmware blob master src lib terrain estimation terrain estimator h PX4 位置估计中
  • 已归档博文收纳

    by luoshi006 欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a L类 Learning GitHub Qt5 5 1 43 OpenCV2 4 10 环境配置PX4 开发环境 xff08 Ubuntu14
  • linux信号量

    1 信号量数据结构 union semun int val 整形变量 信号量初值 struct semid ds buf semid ds结构指针 unsigned short array 数组类型 struct seminfo buf 信
  • 单片机系统中的一种文字平滑(抗锯齿)显示方法

    这是之前一个项目中已实现的方法 xff0c 现在整理后拿出来分享 单片机系统中文字显示部分一般用的是用取模软件取出字模后输出到屏幕上显示 xff0c 这种方式显示的字体有锯齿 xff0c 在DPI低的显示屏上锯齿效果非常明显 对于单色屏来说
  • DIY个人智能家庭网关—— 路由器篇之刷机

    先选择合适的路由器型号 xff0c 要求有两个 xff0c 一 xff1a 有USB口 xff0c 二 xff1a 可以刷openwrt系统 xff0c 我的首选是newifi mini xff0c 比较喜欢折腾的可以刷openwrt官方固
  • 类中的域

    转自http book 51cto com art 201207 350797 htm 类的对象也称为这个类的实例 当创建一个对象时 xff0c 对象包含在类定义中包括的所有域 但是 xff0c 类定义中的域并不总是一样 一共有两种 有一种
  • Postman 插件介绍

    Postman介绍 Postman是google开发的一款功能强大的网页调试与发送网页HTTP请求 xff0c 并能运行测试用例的的Chrome插件 其主要功能包括 xff1a 模拟各种HTTP requests 从常用的 GET POST
  • 【2022阿里灵犀互娱】游戏测开笔试AC_Code

    测开笔试 xff0c 90分钟 xff0c 3道编程题 43 八股 xff0c 第二题输出格式模拟题 xff0c 就不贴了 T1 进制转换 题意 有一个数 xff0c 可能是2 xff5e 16进制的其中之一 xff0c 算出所有可能的结果
  • error while loading shared libraries: libopencv_imgcodecs.so.3.4

    最近给电脑重新安装了opencv3 4 10 xff0c 但是跑工程时却出现这个问题 xff0c 网上百度了一堆 xff0c 发现应该是库设置的问题 xff0c 但是到底是哪里出了问题 xff0c 怎么设置 xff0c 我根据我自己的实际情
  • 六、geotrellis按时间序列存储至hbase

    实现代码如下 xff1a import org apache camel scala dsl builder RouteBuilderSupport import geotrellis raster import geotrellis pr
  • 支持向量机svm及python测试

    from sklearn svm import SVR SVC from sklearn datasets import load boston from sklearn datasets import load wine from skl
  • mlp神经网络及python测试

    关于线性模型 xff1a y 39 61 w 0 x 0 43 w 0 x 0 43 43 w p x p 43 b 其中 xff0c y 39 表示对y的估算值 xff0c x 0 到x p 是样本特征值 w表示每个特征值的权重 xff0
  • linux 安装gdal(含hdf)记录

    一 准备工作 经实践 xff0c 在其他用户下存在某种问题 xff0c 可能是对Centos系统上不熟悉 xff0c 无法解决 xff0c 需在root用户下安装 xff09 xff1a su root 安装编译环境 sudo yum in
  • go语言多线程与并发编程

    go语言并发编程 在了解go语言的并发编程之前 xff0c 我们必须先了解并发和并行的概念 我们知道 xff0c 当启动一个应用的时候实际上是启动了一个进程 xff0c 通过该进程实现资源的调度和分配 xff0c 并且多个进程之间是相互隔离
  • Pycharm 中Available packages nothing to show

    国内源 xff1a 清华 xff1a https pypi tuna tsinghua edu cn simple 阿里云 xff1a http mirrors aliyun com pypi simple 中国科技大学 https pyp
  • 以太坊区块链的区块(Block)结构

    这里以以太坊区块链为基础进行讲解 直接看代码 xff1a 区块结构代码 xff1a block go 1 block的header type Header struct ParentHash common Hash 96 json 34 p
  • go语言连接mongodb数据库

    使用mongodb数据库之前需要先下载安装mongodb服务器端程序 xff0c 这里不再赘述 go语言下使用mongodb步骤如下 xff1a 1 下载mongodb连接驱动mgo 命令行下输入 xff1a go get gopkg in
  • 算法中的常用数学公式

    1 指数 指数是幂运算a a 0 中的一个参数 xff0c a为底数 xff0c n为指数 xff0c 指数位于底数的右上角 xff0c 幂运算表示指数个底数相乘 当n是一个正整数 xff0c a 表示n个a连乘 当n 61 0时 xff0
  • hbase出现org.apache.hadoop.hbase.PleaseHoldException: Master is initializing错误解决

    使用hbase创建namespace和table时提示该错误 xff0c 完整的错误日志如下 xff1a 按照网上的解决思路 xff1a 1 设置主机之间的NTP时间同步 2 修改hbase site xml配置文件 lt property
  • windows下hadoop的部署和使用

    本教程在windows10环境下安装配置hadoop 43 hbase 43 spark 一 下载压缩包 xff1a 1 JavaJDK xff0c 1 8以上 2 Hadoop2 8 3 xff0c 下载地址 xff1a http arc

随机推荐

  • 四、geotrellis发布TMS服务

    本章节将上一章节创建的瓦片发布为TMS服务 本章节将使用akka建立http服务并访问影像瓦片 使用maven构建测试案例 xff0c maven参见上一章节 具体代码如下 xff1a import geotrellis raster im
  • Pyspark实战(四)pyspark操作hbase

    环境配置 xff1a Spark 启动环境中添加 hbase 的 jar 包以及 spark examples的jar包 1 下载spark examples jar包 xff0c 地址https mvnrepository com art
  • 五、geotrellis实现栅格切片并存储至hbase

    部署环境可以参考本栏目的其他章节 1 maven代码如下 xff1a lt dependencies gt lt dependency gt lt groupId gt org apache camel lt groupId gt lt a
  • launch文件和package文件语法

    launch文件语法 参考 xff1a ROS入门之 浅谈launch 沐棋的博客 CSDN博客 roslaunch 补充 xff1a launch prefix 61 command prefix roslaunch 命令 的一个潜在的缺
  • ORB_SLAM2新增稠密建图代码笔记

    接上一篇博客 ORB SLAM2 43 kinect稠密建图实战项目总结 ORB SLAM2 43 kinect稠密建图实战项目总结 好好仔仔的博客 CSDN博客 本篇在此基础上对整个项目的逻辑结构以及代码实现进行梳理 orb slam2新
  • windows下C++学习推荐书籍

    推荐几本书给你们 xff0c 有空可以学习一下 xff1a C 43 43 编程相关 xff1a 1 C 43 43 Primer xff1a C 43 43 的工具书 2 Effective C 43 43 xff1a C 43 43 提
  • stm32IO口八种工作模式详细解析(附原理图)

    目录 工作模式介绍常用IO口工作模式分析实际应用 很多小伙伴们在初学stm32时都对stm32的IO口工作模式的原理和配置不了解 xff0c 所以我整理发表此篇文章作为自己复习和他人参考资料 xff08 注 xff1a 该文章参考了stm3
  • cmake之install总结(指定安装文件和安装位置)

    背景 cmake不仅可以构建可执行文件 xff0c 还可以安装 使用CMake xff0c 我们可以使用install 命令指定安装规则 只需要指定安装位置和待安装的目标文件 xff0c 十分简单 以cmake官方教程为例 xff08 3
  • 工训备赛日志(二)——上位机与stm32之间的一种简易通信方式

    工训备赛日志 xff08 二 xff09 上位机与stm32之间的一种简易通信方式 一 摘要 上位机检测到物体之后 xff0c 要将信号传递给控制底层的STM32 xff0c 这里提出了一种基于读取电平和外部中断的简易通信方式 此方法占用五
  • 【2】中断方式和查询方式的区别

    1 中断方式 xff1a 接收数据时 xff0c MCU转入中断服务程序 xff0c 再处理接收到的数据 xff1b CMT2300A接收数据的中断 xff1a 检测RX FIFO TH 中断 xff0c 一旦有效表示FIFO 已经被填入预
  • Ubantu 安装到VMware详解

    想要在VMware中运行Linux系统 xff0c 那么就需要Linux系统安装到VMware虚拟机上面 在这里 xff0c 以把ubantu16 04安装到VMware虚拟机中为教程进行图文讲解 xff0c 共分为三个步骤 xff0c 分
  • 数字直流电源设计

    设计目标 xff1a 市电输入 开关频率50KHz 60V 20A 1200W输出 输出电压纹波0 2 输出电流纹波20 效率0 8 1 确定输入电压 经查阅 xff0c 我国市电电压标准 xff0c 220V单相供电时 xff0c 为额定
  • CAN报文格式

    CAN协议的报文传输过程中有 数据帧 远程帧 错误帧 过载帧和帧间隔 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 1 数据帧 用于发送节点向接收节点传送数据的帧 nbsp nbsp nbsp nbsp nbsp n
  • FreeRTOS调度器启动

    nbsp 在真正启动调度器之前 先创建空闲任务 初始化一些变量 真正启动调度器的函数是xPortStartScheduler 启动调度器 void vTaskStartScheduler void BaseType t xReturn if
  • 安装novnc,并加入开机自启

    1 安装git工具 apt get install git y 2 下载novnc git clone https github com novnc noVNC 3 ls 查看 xff0c 已经下载完成 4 vim novnc sh把启动命
  • 【C++初阶11-模版进阶】解锁C++模版更多玩法

    今天 xff0c 带来模版进阶的讲解 主要讲解 xff1a 非类型模版参数模版的特化模版的分离编译 文中不足错漏之处望请斧正 xff01 非类型模版参数 模版参数分为类型模版参数和非类型模版参数 可以这么理解 xff1a 前者是为了泛化类型
  • Qt 获取当前时间

    1 获取带日期的时间 xff0c 使用QDateTime类 QDateTime current date time 61 QDateTime currentDateTime QString current date 61 current d
  • Qt 判断文件或文件夹是否存在及创建文件夹

    1 判断文件夹是不是存在 参数说明 xff1a QString fullPath 文件夹全路径 方法1 bool isDirExist QString fullPath QDir dir fullPath if dir exists ret
  • Qt阻塞延时与非阻塞延时(四种方法之个人笔记)

    功能描述 毫秒级非阻塞延时函数 参数 延时毫秒数 其他说明 已试验 可用 但CPU占用率较高 void VdpuMngUI msecSleep int msec QTime dieTime 61 QTime currentTime addM
  • 获取本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息及网线是否插入状态

    使用windows sdk提供的API函数GetAdaptersInfo 可以获得本机所有网卡的网卡名 网卡描述 网卡MAC地址 网卡IP 网卡类型等信息 xff0c 并用IP ADAPTER INFO结构体存储 xff0c 使用GetIf