DWORD GetAdaptersInfo(
  PIP_ADAPTER_INFO pAdapterInfo,  //指向一个缓冲区,用来取得IP_ADAPTER_INFO结构列表
  PULONG pOutBufLen   //指定上面缓冲区大小,如果大小不够,此参数返回所需大小

IP_ADAPTER_INFO结构包含了本地计算机网络适配器的信息
typedef struct _IP_ADAPTER_INFO {
  struct _IP_ADAPTER_INFO* Next;//指向链表中下一个适配器(计算机可能有多个适配器)
  DWORD ComboIndex; //保留字段
  char AdapterName[MAX_ADAPTER_NAME_LENGTH + ];//使用ANSI字符串表示的适配器名称
  char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + ];//使用ANSI字符串表示的适配器描述
  UINT AddressLength;//适配器MAC地址以字节计算的长度(一般6个字节)
  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;//该适配器是否使用WINS(Windows Internet名称服务)
  IP_ADDR_STRING PrimaryWinsServer;//WINS服务器主IP地址
  IP_ADDR_STRING SecondaryWinsServer;//WINS次IP地址
  time_t LeaseObtained;//获取当前DCHP租用时间
  time_t LeaseExpires;//当前DCHP租用期满时间
  } IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;

IP_ADDR_STRING也是一个结构体

typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;//指向下一个IP地址信息
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;//子网掩码
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING; typedef struct {
char String[ * ];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING; typedef struct {
char String[ * ];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;

完整代码如下

#include <iostream>
#include <windows.h>
#include <Iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib") using namespace std; BOOL GetGlobalData()
{
PIP_ADAPTER_INFO pIPAdapterInfo = new IP_ADAPTER_INFO();
PIP_ADAPTER_INFO adapters = nullptr;
ULONG size = sizeof(IP_ADAPTER_INFO);
//填充pIPadapterInfo变量,其中size既是一个输入量,也是一个输出量
int nRet = GetAdaptersInfo(pIPAdapterInfo, &size);
//记录网卡数量
int netCarNum = ; if (ERROR_BUFFER_OVERFLOW == nRet)
{
//如果返回此参数,说明GetAdaptersInfo参数传递的内存空间大小不够,同时传出size表示需要的内存空间大小
//释放原来的内存空间
delete pIPAdapterInfo;
pIPAdapterInfo = (PIP_ADAPTER_INFO)new byte[size];
//再次调用GetAdaptersInfo填充结构体
nRet = GetAdaptersInfo(pIPAdapterInfo, &size);
} if (ERROR_SUCCESS == nRet)
{
adapters = pIPAdapterInfo;
//输出网卡信息,可能有多卡,需要循环判断
while (adapters)
{
cout << " 网卡数量: " << ++netCarNum << endl;
cout << " 网卡名称: " << adapters->AdapterName << endl;
cout << " 网卡描述: " << adapters->Description << endl;
cout << " 网卡类型: ";
switch (adapters->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: ";
//以XX-XX-XX-XX-XX-XX的形式输出MAC
for (DWORD i = ; i < adapters->AddressLength; ++i)
{
if (i < adapters->AddressLength - )
{
printf("%02X-", adapters->Address[i]);
}
else
{
printf("%02X\n", adapters->Address[i]);
}
} //可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString = &(adapters->IpAddressList);
do
{
//记录每张网卡的IP地址数量
int IPNumPerCar = ;
cout << "该网卡上的IP数量:" << ++IPNumPerCar << endl;
cout << " IP 地址:" << pIpAddrString->IpAddress.String << endl;
cout << " 子网地址:" << pIpAddrString->IpMask.String << endl;
cout << " 网关地址:" << adapters->GatewayList.IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
adapters = adapters->Next;
cout << "--------------------------------------------------------------------" << endl;
}
}
  //释放分配的内存
  if (pIPAdapterInfo)
    delete pIPAdapterInfo;
  
  return true;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

C++通过GetAdapatersInfo获取网卡配置信息的更多相关文章

  1. C# 获取电脑配置信息

    对于软件绑定电脑常用到的方法汇总 public class Computer { public string MyProperty { get; set; } /// <summary> ...

  2. 使用ioctl获取网卡统计信息

    ethtool -S获取接口统计信息总共分三步: 1.获取统计项个数,使用SIOCETHTOOL+ETHTOOL_GSSET_INFO 2.(可选)获取统计项名字,使用SIOCETHTOOL+ETHT ...

  3. GetAdaptersInfo获取网卡配置和Ip地址信息

    一台机器上可能不只有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址:如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种:因此,如果要获得本机所有网卡的IP和M ...

  4. spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)

    利用扫描的方式将组件注入容器,就也可以不用操作bean来实例化对象了. 下面我做一个例子 我用的spring3.2.2版本的 首先写一个spring.xml. <?xml version=&qu ...

  5. linux 网卡配置信息

    vi /etc/sysconfig/network-scripts/ifcfg-eth0

  6. NHibernate获取实体配置信息(表名,列名等等)

    // 注意这里有个&符号,并不是写错了,而是约定 就是这样写的ctx.GetObject("&SessionFactory") 这是官网地址http://nhfor ...

  7. .NetCore获取Json和Xml格式的配置信息

    本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings. ...

  8. 28-Ubuntu-远程管理命令-02-查看网卡的配置信息

    命令 功能 ifconfig 查看网卡配置信息 ifconfig | grep inet 查看网卡对应的IP地址 ping  127.0.0.1 检测本地网卡是否正常 ping  IP地址 检测到目标 ...

  9. Linux CentOS虚拟机网卡配置

    最近在VMware安装CentOS6.5之后,每次从宿主机访问虚拟机的Oracle时,都要修改IP地址,因为没有设置虚拟机的IP,所以每次开机之后虚拟机的IP地址都是随机的,于是研究了下给虚拟机配置静 ...

随机推荐

  1. 使用Jenkins部署asp.net core

    首先盗图一张 1.在Github上创建一个测试仓库 2.创建基于Asp.net Core的MVC项目 运行解决方案,验证代码没有问题,然后将代码迁入Github 3.添加Docker支持 项目--&g ...

  2. Ubuntu VMware workstation虚拟机清理缓存文件获得更大硬盘空间

    1 前言 VMware workstation 15 Player经常使用拖拉复制文件到虚拟机,从而导致了drag_and_drop特别大,占用了很多硬盘空间. fanbi@ubuntu:~/.cac ...

  3. Mac 与 windows eclipse 快捷键对照

      Mac windows 方法注释 option+command+j alt+shift+j 在方法里上右击,source -> Generate Element Comment 删除当前行 ...

  4. Bootstrap-datepicker3官方文档中文翻译---Options/选项(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)

    Options/选项 带“Date”的所有选项都可以处理 Date 对象; 字符串格式化根据 给定的 format 而定; 相对于今天的时间变量, 如 “-1d”, “+6m +1y”等等, 其中有效 ...

  5. 出错:Error creating bean with name 'studentServiceImpl': Unsatisfied dependency expressed through field 'studentMapper';

    详细错误: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with nam ...

  6. JsRender实用入门教程

    这篇文章主要介绍了JsRender实用入门实例,包含了tag else使用.循环嵌套访问父级数据等知识点,并提供了完整的实例下载,非常具有实用价值,需要的朋友可以参考下     本文是一篇JsRend ...

  7. MySQL/Oracle数据库优化总结

    MySQL数据库优化的八种方式 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能 ...

  8. Linux基础 -Ubuntu

    Ubuntu 下: sudo 以管理员权限执行 apt 是Advanced Packaging Tool ,Ubuntu下的安装包管理工具,早期使用apt-get,从Ubuntu16开始建议使用apt ...

  9. js变量污染引起的诡异bug

    js方法是这样的: //保存提货券JSON数据到隐藏字段 saveVoucherListInfoToHiddenFiled: function () { //保存绑定商品信息 var voucherL ...

  10. 用html给div加类似a标签的超链接(转)

    今天项目中遇到用html给div加类似a标签的超链接,回想半天,万幸还是想出来了. 分享一下啊: 1.通过window.open函数 <div onclick="window.open ...