2012-04-28 69 views
2

如何在C++中找到应用程序当前正在运行的计算机的mac地址,然后将该mac地址与某个mac地址进行比较?如何找到一个mac地址?

因此可以说我们想要比较的某个mac地址是AB-12-CD-34-EF-56,如何找到运行该应用程序的mac地址,然后将该mac地址与AB-12-CD-34-EF-56 mac地址进行比较?做这样的事情的最好和最简单的方法是什么?

+1

这完全取决于您正在运行的操作系统。鉴于你已经标记了这个VC++,你必须在Windows网络API中寻找适当的函数。 – 2012-04-28 15:16:52

+1

[visual 6.0和查找mac地址]的可能的重复(http://stackoverflow.com/questions/10365739/visual-6-0-and-finding-mac-address) – Joe 2012-04-28 18:30:47

回答

1

在Windows上,您可以使用函数GetAdaptersAddresses()来获取包含PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];(这是mac地址)的IP_ADAPTER_ADDRESSES结构。

该函数将引入库Iphlpapi.lib和头文件<iphlpapi.h>作为依赖关系。一个简单的例子,它将打印从可用适配器的所有mac地址:

#include <Winsock2.h> 
#include <iphlpapi.h> 
#include <cstdint> 
#include <cstdio> 
#include <cstdlib> 
#include <vector> 
#pragma comment(lib, "IPHLPAPI.lib") 

int main(int argc, char* argv[]){ 
    ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES); 
    GetAdaptersAddresses(0, 0, NULL, NULL, &outBufLen); 
    std::vector<uint8_t> bytes(outBufLen, 0); 
    PIP_ADAPTER_ADDRESSES pCurrAddresses = (IP_ADAPTER_ADDRESSES *)bytes.data(); 
    DWORD dwRetVal = GetAdaptersAddresses(0, 0, NULL, pCurrAddresses, &outBufLen); 
    if (dwRetVal == NO_ERROR) { 
    while (pCurrAddresses != NULL){ 
     for (size_t i = 0; i < (int) pCurrAddresses->PhysicalAddressLength; i++) { 
     if (i == (pCurrAddresses->PhysicalAddressLength - 1)) 
      std::printf("%.2X\n", (int) pCurrAddresses->PhysicalAddress[i]); 
     else 
      std::printf("%.2X-",(int) pCurrAddresses->PhysicalAddress[i]); 
     } 
     pCurrAddresses = pCurrAddresses->Next; 
    } 
    } 
    std::system("pause"); 
    return 0; 
} 
+0

不要'新的POD()'。使用'malloc'或'HeapAlloc'来保持特定的平台...或只是一个'std :: vector '。尽可能避免“裸新”()。当你使用它时,用它来适当的对象,而不是POD。 – CodeAngry 2014-07-09 07:52:03

+0

@CodeAngry为什么我不应该在POD中使用'new'有什么具体原因吗?之所以我在这里使用'new'是因为我经常阅读SO,所以'malloc'不应该在C++中使用。即http://stackoverflow.com/questions/184537/in-what-c​​ases-do-i-use-malloc-vs-new – Constantin 2014-07-09 07:59:02

+0

他们说,不使用'malloc'出于同样的原因,因为不使用' new'。为了避免裸指针,因为人们倾向于忘记“释放”/“删除”它们,特别是在具有多个退出'(返回)'的代码中。 [检查rastertek DX教程的代码,你会看到。] std :: vector <>'释放内存,对于POD和对象都是很好的。经验法则是,除非你真的知道你在做什么,谁拥有对象并访问它,并且是异常安全的......不要使用new/malloc。为您的堆对象存储需求使用'std :: containers'或'std :: unique_ptr'。 - * Hai bafta!* – CodeAngry 2014-07-09 08:04:27