2012-04-28 34 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