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. echarts-map-区县

    首先通过百度获取经纬度 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...

  2. Java_File类

    File类以抽象的方式代表文件名和目录路径.该类主要用于文件和目录的创建.查找.删除等.先来看一下File的构造方法: // 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 File ...

  3. TopN案例

    准备三份数据 t1 2067 t2 2055 t3 2055 t4 1200 t5 2367 t6 255 t7 2555 t8 12100 t9 20647 t10 245 t11 205 t12 ...

  4. day20包

    https://www.cnblogs.com/Eva-J/articles/7292109.html 一.模块: 1.什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名 ...

  5. set操作

    Set操作,Set集合就是不允许重复的列表 sadd(name,values) # name对应的集合中添加元素 scard(name) 获取name对应的集合中元素个数 sdiff(keys, *a ...

  6. Fiddler 抓包工具入门

    转自:https://www.cnblogs.com/yyhh/p/5140852.html 序章 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操 ...

  7. RPC远程过程调用

    什么是RPC: 将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作RPC: (Remote Procedure Call远程过程调用) RPC是一个计算机通信协议. rpc指的是在计算机A上 ...

  8. navicat连接centos7上mysql:2003-Can't connect to MySQL server (10060)

    问题解决步骤: 1.参考http://jingyan.baidu.com/article/95c9d20dac9040ec4f75617a.html,发现是防火墙未关闭: 2.关闭并禁止firewal ...

  9. twig模板的进一步学习以及在symfony当中的使用

    首先,twig可以理解为用于输出html代码的,虽然用PHP等其他语言也可以输出,但是twig更为简洁高效,同时twig模板被编译成原生的php类缓存起来,所以才会这么快, 其实twig跟php类差不 ...

  10. Oracle:select into 查询没有记录的解决办法

    在数据库编程中,select into 语句可以将数据库的某些值赋值给程序的变量,使用起来非常方便.但很多时候也会遇到查询出来没有记录的情况,这时程序会出错. 可以使用 exception when ...