如何使用 C++ 在 Windows 中获取 MAC 地址? [关闭]

Posted

技术标签:

【中文标题】如何使用 C++ 在 Windows 中获取 MAC 地址? [关闭]【英文标题】:How to get MAC Address in Windows with C++? [closed] 【发布时间】:2012-11-18 18:09:35 【问题描述】:

我需要一些有关 MAC 地址的帮助。我必须通过在 C++ 中使用一些代码来获得它,所以有人可以帮助我吗?我已经尝试了很多无用的代码。如果存在任何我应该研究以查找 MAC 地址的特定方法或库,如果有人通过我的链接或其他内容了解更多信息,我将非常高兴。

【问题讨论】:

这是一个特定于平台的问题,与(标准)C++ 无关。因此,请告诉我们您要为哪个操作系统获取此信息。 什么媒体访问控制器的MAC地址呢?可能有很多。 ***.com/questions/823553/… 操作系统是 Windows(所有版本)。我也需要为 Linux 做,但在遥远的未来:P @Prof.Falken:不是骗子。另一个问题高度特定于大多数代码试图处理的场景。 【参考方案1】:

我明白了!我和工作中的一个人使用以下代码解决了这个问题:

#include <stdio.h>
#include <Windows.h>
#include <Iphlpapi.h>
#include <Assert.h>
#pragma comment(lib, "iphlpapi.lib")

char* getMAC();

int main() 
  char* pMac = getMAC();
  system("pause");
  free(pMac);

char* getMAC() 
  PIP_ADAPTER_INFO AdapterInfo;
  DWORD dwBufLen = sizeof(IP_ADAPTER_INFO);
  char *mac_addr = (char*)malloc(18);

  AdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
  if (AdapterInfo == NULL) 
    printf("Error allocating memory needed to call GetAdaptersinfo\n");
    free(mac_addr);
    return NULL; // it is safe to call free(NULL)
  

  // Make an initial call to GetAdaptersInfo to get the necessary size into the dwBufLen variable
  if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == ERROR_BUFFER_OVERFLOW) 
    free(AdapterInfo);
    AdapterInfo = (IP_ADAPTER_INFO *) malloc(dwBufLen);
    if (AdapterInfo == NULL) 
      printf("Error allocating memory needed to call GetAdaptersinfo\n");
      free(mac_addr);
      return NULL;
    
  

  if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == NO_ERROR) 
    // Contains pointer to current adapter info
    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
    do 
      // technically should look at pAdapterInfo->AddressLength
      //   and not assume it is 6.
      sprintf(mac_addr, "%02X:%02X:%02X:%02X:%02X:%02X",
        pAdapterInfo->Address[0], pAdapterInfo->Address[1],
        pAdapterInfo->Address[2], pAdapterInfo->Address[3],
        pAdapterInfo->Address[4], pAdapterInfo->Address[5]);
      printf("Address: %s, mac: %s\n", pAdapterInfo->IpAddressList.IpAddress.String, mac_addr);
      // print them all, return the last one.
      // return mac_addr;

      printf("\n");
      pAdapterInfo = pAdapterInfo->Next;        
     while(pAdapterInfo);                        
  
  free(AdapterInfo);
  return mac_addr; // caller must free.

【讨论】:

msdn.microsoft.com/en-us/library/windows/desktop/… 我在这段代码中看到了内存泄漏:如果return mac_addr; 发生,free(AdapterInfo); 不会发生。另一个问题是如果return mac_addr; 没有发生,该函数不会返回任何内容。但基本的想法似乎是正确的。 您可以使用以下代码(代替 sprintf)来避免 VS 2015 sprintf_s(mac_addr, 6 * sizeof(pAdapterInfo->Address[1]), "%02X:%02X: %02X:%02X:%02X:%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[ 4], pAdapterInfo->地址[5]); 除非您仍然支持 Windows 2000,否则您应该使用 GetAdaptersAddresses msdn.microsoft.com/en-us/library/windows/desktop/… mac_addr = (char*)malloc(17); 应该是mac_addr = (char*)malloc(18);,所以NUL 有空间终止字符串。【参考方案2】:

C++ 没有任何内置的“MAC 地址”概念,它不是为了让 C++ 代码运行而必须存在的东西。因此,它是特定于平台的。您必须告诉我们您要为哪个平台执行此操作,并且(当然)还要阅读与该平台匹配的文档。

如果您想以可移植的方式执行此操作,则应寻找支持所有所需平台的合适库。

另外,请注意,一台计算机可以有任意数量的网络适配器,因此并不要求只有 一个 MAC 地址。

【讨论】:

感谢您的回答,放松一下。我正在为 Windows 使用 Dev C++。我尝试使用这样的代码:***.com/questions/221894/…

以上是关于如何使用 C++ 在 Windows 中获取 MAC 地址? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取 Windows 下的内存使用情况

如何使用 C++ 在 Windows 中获取 MAC 地址? [关闭]

使用 C++ 在 Windows 中获取时区

如何在windows c++中的cmd中运行命令后获取退出代码

使用 C++ 在 Windows 中获取 OSVersion

如何在 C++ 中获取操作系统名称?