Как получить MAC-адрес в Windows с C ++?

12

Мне нужна помощь с MAC-адресами. Я должен получить его, используя какой-то код на С++, и может ли кто-нибудь помочь мне с этим? Я уже пробовал много бесполезных кодов. Если существует какой-либо конкретный метод или lib, который я должен изучить, чтобы найти MAC-адрес, я буду очень рад, если кто-нибудь передаст мне ссылку или что-то еще об этом.

  • 3
    В какой операционной системе?
  • 4
    Это специфический для платформы вопрос, который не имеет ничего общего с (стандартным) C ++. Поэтому, пожалуйста, сообщите нам, для какой ОС вы пытаетесь получить это.
Показать ещё 7 комментариев
Теги:
mac-address

2 ответа

21

У меня есть люди! Я и парень из работы решают это с помощью этого кода:

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

char* getMAC();

int main(){ 
    getMAC();
    system("pause");
}
char* getMAC(){
PIP_ADAPTER_INFO AdapterInfo;
DWORD dwBufLen = sizeof(AdapterInfo);
char *mac_addr = (char*)malloc(17);

AdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
if (AdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo\n");

}

// Make an initial call to GetAdaptersInfo to get the necessary size into the dwBufLen     variable
if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == ERROR_BUFFER_OVERFLOW) {

AdapterInfo = (IP_ADAPTER_INFO *) malloc(dwBufLen);
if (AdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo\n");
 }
 }

if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == NO_ERROR) {
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;// Contains pointer to current adapter info
do {
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);
return mac_addr;

printf("\n");
pAdapterInfo = pAdapterInfo->Next;        
}while(pAdapterInfo);                        
}
free(AdapterInfo);
}
  • 0
    msdn.microsoft.com/en-us/library/windows/desktop/...
  • 0
    Я вижу утечку памяти в этом коде: free(AdapterInfo); не происходит, если return mac_addr; случается. Другая проблема заключается в том, что функция ничего не возвращает, если return mac_addr; не бывает Но основная идея кажется правильной.
Показать ещё 4 комментария
6

С++ не имеет встроенной концепции "MAC-адрес", это не то, что должно существовать для запуска кода С++. Таким образом, он зависит от платформы. Вы должны сказать нам, на какой платформе вы пытаетесь это сделать, а также (конечно) прочитать документацию, соответствующую этой платформе.

Если вы хотите сделать это переносимым способом, вы должны искать подходящую библиотеку, которая поддерживает все необходимые платформы.

Также обратите внимание, что на компьютере может быть любое количество сетевых адаптеров, поэтому нет требования, чтобы был только один MAC-адрес.

  • 0
    Спасибо за ответ, раскрутите. Я использую Dev C ++ для Windows. Я пытался использовать такие коды: stackoverflow.com/questions/221894/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню