2012-04-28 3 views
2

Как я могу найти в C++, MAC-адрес компьютера, на котором в настоящее время работает приложение, а затем сравнить этот адрес с определенным MAC-адресом?Как найти адрес mac?

так что скажем, что определенный MAC-адрес, который мы хотим сравнить с AB-12-CD-34-EF-56, как можно найти MAC-адрес, на котором работает приложение, а затем сравнить этот адрес с MAC-адресом AB-12-CD-34-EF-56? Каков наилучший и самый простой способ сделать что-то подобное?

+1

Это зависит полностью от ОС, на котором вы работаете. Учитывая, что вы отметили этот VC++, вам нужно будет посмотреть в API-интерфейсах Windows для соответствующей функции. –

+1

Возможный дубликат [визуальный 6.0 и поиск MAC-адреса] (http://stackoverflow.com/questions/10365739/visual-6-0-and-finding-mac-address) – Joe

ответ

1

В Windows вы можете использовать функцию GetAdaptersAddresses(), чтобы получить структуру IP_ADAPTER_ADDRESSES, которая содержит PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; (это адрес mac).

Эта функция представит библиотеку 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

Не 'new POD()'. Используйте 'malloc' или' HeapAlloc', чтобы оставаться на платформе конкретным ... или просто 'std :: vector '. Избегайте 'naked new()' как можно больше. И когда вы используете его, используйте его для правильных объектов, а не POD. – CodeAngry

+0

@CodeAngry Есть ли какая-то конкретная причина, почему я не должен использовать 'new' с POD? Причина, по которой я использовал 'new' здесь, заключается в том, что я часто читал SO, что' malloc' не должен использоваться на C++ вообще. т.е. http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – Constantin

+0

Говорят, что не используйте 'malloc' по той же причине, что и не использовать' new'. Чтобы избежать голых указателей, потому что люди склонны забывать «освобождать»/«удалять» их, особенно в коде с несколькими выходами '(возвращает)'. [Checkout rastertek DX tutorials], и вы увидите.] 'Std :: vector <>' освобождает память при уничтожении и хорош как для POD, так и для объектов. Правило большого пальца есть, если вы действительно не знаете, что делаете, кто владеет объектом и кто его обращается, и безопасны для исключений ... не используйте new/malloc. Используйте 'std :: container' или' std :: unique_ptr' для хранения хранилища объектов кучи. - * Hai bafta! * – CodeAngry

Смежные вопросы