web-dev-qa-db-fra.com

Comment obtenir l'adresse MAC dans Windows avec C ++?

J'ai besoin d'aide avec les adresses MAC. Je dois l'obtenir en utilisant du code en C++, alors quelqu'un pourrait-il m'aider? J'ai déjà essayé beaucoup de codes inutiles. S'il existe une méthode ou une bibliothèque spécifique que je devrais étudier pour trouver l'adresse MAC, je serais très heureux si quelqu'un me passait un lien ou quelque chose pour en savoir plus.

14
guiarrd

J'ai les gens! Moi et un gars du travail résolvons cela en utilisant ce code:

#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.
}
22
guiarrd

C++ n'a pas de concept intégré d '"adresse MAC", ce n'est pas quelque chose qui doit exister pour que le code C++ s'exécute. C'est donc spécifique à la plateforme. Vous devez nous dire pour quelle plate-forme vous essayez de le faire, et aussi (bien sûr) lire la documentation qui correspond à cette plate-forme.

Si vous souhaitez le faire de manière portable, vous devez rechercher une bibliothèque appropriée qui prend en charge toutes les plates-formes souhaitées.

Notez également qu'un ordinateur peut avoir n'importe quel nombre d'adaptateurs réseau, il n'est donc pas nécessaire qu'il y ait juste n adresse MAC.

6
unwind