如何获取相同的MAC地址?

5
我使用以下代码获取MAC地址:
IP_ADAPTER_INFO adpInfo[16];
DWORD len = sizeof(adpInfo);
GetAdaptersInfo(adpInfo, &len );
printf("%02x%02x%02x%02x%02x%02x", adpInfo[0].Address[0], adpInfo[0].Address[1], adpInfo[0].Address[2], adpInfo[0].Address[3], adpInfo[0].Address[4], adpInfo[0].Address[5]);

然而,如果计算机有多个网络适配器(例如:以太网和WiFi),那么每次调用此代码时我都会得到不同的MAC地址。

是否有一种方法始终获取相同的MAC地址(例如:以太网)。


我总是得到相同的结果。 - adjan
1
@addy2012 抱歉,我的意思是你可以在某个时候获取另一个MAC地址,而不是立即获取。 - John
@addy2012 我曾经调用它并得到了MAC AF-BB...,然后几天后我再次调用它,得到了MAC D1-AE... - John
通常情况下,它应该返回有关机器上安装/启用的所有适配器的信息。但是,在上面的代码中,您只显示了第一个适配器,因此如果顺序更改,您将看到不同的适配器。当然,对于某些适配器,用户还可以修改适配器的MAC地址。 - Jerry Coffin
查询 Windows 系统上配置的 NIC 有几种方法,包括 GetAdaptersInfo()gethostbyname() 等。不幸的是,没有可靠的方法可以确保您以相同的顺序获取相同的 NIC。建议:将 NIC 复制到排序列表(或 dictionary hash)中。 - FoggyDay
显示剩余2条评论
2个回答

3

由于GetAdaptersInfo方法包含与IPCONFIG /ALL几乎相同的信息(包括DHCP服务器、网关、IP地址列表、子网掩码和WINS服务器),因此您可以使用它。它还枚举了PC上的所有NIC,即使它们没有连接到有效的网络(但是在Windows中必须启用这些NIC)。

示例,打印所有接口:

static void GetMACaddress(void)
{
  IP_ADAPTER_INFO AdapterInfo[16];

  DWORD dwBufLen = sizeof(AdapterInfo);

  DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);

  assert(dwStatus == ERROR_SUCCESS);

  PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;

  do {
    PrintMACaddress(pAdapterInfo->Address);
    pAdapterInfo = pAdapterInfo->Next;
  }
  while(pAdapterInfo);
}

你可以保存AdapterName,然后在下次调用时进行比较,以确保检索到指定适配器的MAC地址。
查看这里的IP_ADAPTER_INFO结构:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366062%28v=vs.85%29.aspx 代码来源:http://www.codeguru.com/cpp/i-n/network/networkinformation/article.php/c5451/Three-ways-to-get-your-MAC-address.htm

1
我相信Windows操作系统枚举网络适配器信息取决于网络适配器的优先级。 可以通过转到“打开网络和共享中心 -> 更改适配器设置 -> 高级[如果不可见,请启用菜单栏] -> 高级设置”来查看和编辑网络适配器的优先级。 您可以编辑网络适配器的优先级。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接