C++ 获取网络适配器的 MAC 地址 _ Windows API 与系统接口【干货】

梦晨吖_5298

梦晨吖_5298

2026-05-19

318人浏览

原创

推荐使用GetAdaptersAddresses API获取物理网卡MAC地址:先调用两次获取缓冲区大小并分配内存,遍历适配器链表时过滤未启用、环回、隧道接口及非6字节地址,再格式化输出十六进制MAC。

c++ 获取网络适配器的 mac 地址 _ windows api 与系统接口【干货】

如果您在 Windows 平台上使用 C++ 开发网络相关程序,需要准确获取物理网卡的 MAC 地址,则可能遇到虚拟适配器干扰、地址长度不固定、接口未启用导致 PhysicalAddressLength 为 0 等问题。以下是解决此问题的步骤:

一、使用 GetAdaptersAddresses(推荐现代方式)

GetAdaptersAddresses 是 Windows Vista 及以后版本唯一官方推荐的 API,支持 IPv4/IPv6、可过滤未启用接口、能正确返回 Hyper-V、WSL2 等现代虚拟网卡的物理地址(若驱动提供),且避免了旧 API 的信息缺失缺陷。它通过 IP_ADAPTER_ADDRESSES 链表返回全部适配器信息,MAC 地址存储在 PhysicalAddress 字节数组中,长度由 PhysicalAddressLength 字段明确指示。

1、在源文件顶部包含头文件:#include

2、链接库:#pragma comment(lib, "Iphlpapi.lib") 或在项目设置中添加 Iphlpapi.lib

3、声明变量并首次调用以获取所需缓冲区大小:ULONG size = 0; GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, nullptr, &size);

4、分配足够内存并第二次调用:std::vector buf(size); PIP_ADAPTER_ADDRESSES addr = reinterpret_cast(buf.data()); GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, addr, &size);

5、遍历链表,跳过无效项:for (auto p = addr; p != nullptr; p = p->Next) { if (p->OperStatus != IfOperStatusUp || p->PhysicalAddressLength != 6 || p->IfType == IF_TYPE_SOFTWARE_LOOPBACK || p->IfType == IF_TYPE_TUNNEL) continue;

6、格式化输出 MAC 地址:printf("%02X-%02X-%02X-%02X-%02X-%02X\n", p->PhysicalAddress[0], p->PhysicalAddress[1], p->PhysicalAddress[2], p->PhysicalAddress[3], p->PhysicalAddress[4], p->PhysicalAddress[5]);

二、使用 GetAdaptersInfo(兼容旧系统方案)

GetAdaptersInfo 是 Windows 2000 起提供的遗留 API,仅支持 IPv4 接口,不识别 IPv6-only 适配器、Hyper-V vSwitch、部分容器网络接口,且 Address 字段仅预留 8 字节空间,易发生截断或全零输出。适用于必须兼容 Windows XP 的极少数场景,但需主动规避其已知缺陷。

1、包含头文件:#include

2、链接库:pragma comment(lib, "Iphlpapi.lib")

3、首次调用获取缓冲区大小:ULONG bufferSize = 0; GetAdaptersInfo(nullptr, &bufferSize);

Windows 图片打印
Windows 图片打印

通过 Python 使用 mspaint /pt 在 Windows 上打印图像——绕过 bash 中文路径编码问题。

下载

4、分配内存并重试:PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO)malloc(bufferSize); GetAdaptersInfo(pAdapterInfo, &bufferSize);

5、遍历适配器链表,校验类型与地址有效性:while (pAdapterInfo) { if ((pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET || pAdapterInfo->Type == IF_TYPE_IEEE80211) && pAdapterInfo->AddressLength == 6) {

6、提取并格式化 MAC:for (int i = 0; i Address[i], i

三、解析 ipconfig /all 命令输出(辅助验证方案)

该方法不依赖 API 调用,而是启动子进程执行系统命令并解析标准输出,适用于调试、日志比对或无法链接 Iphlpapi.lib 的受限环境。其本质是文本匹配,稳定性低于原生 API,且需处理多语言系统下“物理地址”字段名本地化问题(如中文系统为“物理地址”,英文为“Physical Address”)。

1、构造命令行字符串:std::string cmd = "ipconfig /all > temp_ipconfig.txt";

2、执行命令并等待完成:system(cmd.c_str());

3、以只读方式打开生成的临时文件:std::ifstream file("temp_ipconfig.txt");

4、逐行读取,查找含“物理地址”或“Physical Address”的行:std::string line; while (std::getline(file, line)) { if (line.find("物理地址") != std::string::npos || line.find("Physical Address") != std::string::npos) {

5、提取冒号后内容并去除空格与换行:size_t pos = line.find(':'); if (pos != std::string::npos) { std::string macPart = line.substr(pos + 1); macPart.erase(0, macPart.find_first_not_of(" \t")); macPart.erase(macPart.find_last_not_of(" \t") + 1);

6、输出清洗后的 MAC 字符串:std::cout

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

windows c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3689

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2468

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1400

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1338

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1436

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2398

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3960

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

18755

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习