[C/C++] Récupérer la MAC d'un adapter réseau

Discussion dans 'Web, design' créé par neku, 11 Janvier 2007.

Statut de la discussion:
Fermée.
  1. Offline
    neku Codeur roumain
    Je ne pense pas devoir expliquer le code vu qu'il est largement commenté et que le titre parle de lui même

    Code:
    [size=2][color=#0000ff]#include[/color][/size][size=2][color=#000000] "stdafx.h"[/color]
     
    [/size][size=2][color=#0000ff]#include[/color][/size][size=2][color=#000000] <Winsock2.h>[/color]
     
    [/size][size=2][color=#0000ff]#include[/color][/size][size=2][color=#000000] <Iptypes.h>[/color]
     
    [/size][size=2][color=#0000ff]#include[/color][/size][size=2][color=#000000] <Iphlpapi.h>[/color]
     
    [/size][size=2][color=#0000ff]#include[/color][/size][size=2][color=#000000] <stdio.h>[/color]
     
    [/size][size=2][color=#0000ff]#pragma[/color][/size][size=2][color=#0000ff]comment[/color][/size][size=2][color=#000000]([/color][/size][size=2][color=#0000ff]lib[/color][/size][size=2][color=#000000], "Iphlpapi.lib")[/color]
     
    [/size][size=2][color=#0000ff]#pragma[/color][/size][size=2][color=#0000ff]comment[/color][/size][size=2][color=#000000]([/color][/size][size=2][color=#0000ff]lib[/color][/size][size=2][color=#000000], "Ws2_32.lib")[/color]
     
    [/size][size=2][color=#0000ff]char[/color][/size][size=2][color=#000000]* GetMacAddress ([/color][/size][size=2][color=#0000ff]int[/color][/size][size=2][color=#000000] AdapterID) {[/color]
     [/size][indent][size=2][color=#008000]//Variable qui permettra de compter le nombre d'adapter parcouru
     
    [/color][/size][size=2][color=#0000ff]int[/color][/size][size=2] nAdapterCount = 0;
     
    [/size][size=2][color=#008000]//Variable qui contiendra l'ip associé à l'adapter parcouru
     
    [/color][/size][size=2]ULONG IP;
     
    [/size][size=2][color=#008000]//Variable qui contiendra la taille du buffer
     
    [/color][/size][size=2]ULONG Buflen;
     
    [/size][size=2][color=#008000]//Pointeurs vers les infos de l'adapter
     
    [/color][/size][size=2]PIP_ADAPTER_INFO pAdInfo = NULL;
     
    PIP_ADAPTER_INFO pAdInfo_c = NULL;
     
    [/size][size=2][color=#008000]//On définit la taille du buffer à 0
     
    [/color][/size][size=2]Buflen = 0;
     
    [/size][size=2][color=#008000]//Vu que Buflen est défini à 0, la taille du buffer est trop petite
     
    [/color][/size][size=2][color=#008000]//Donc la fonction GetAdaptersInfo va nous renvoyer dans Buflen la taille exacte
     
    [/color][/size][size=2]GetAdaptersInfo(pAdInfo,&Buflen);
     
    [/size][size=2][color=#008000]//Initialisation du pointeur pAdInfo & pAdInfo_c
     
    [/color][/size][size=2]pAdInfo = ([/size][size=2][color=#0000ff]struct[/color][/size][size=2] _IP_ADAPTER_INFO *)[/size][size=2][color=#0000ff]new[/color][/size][size=2] UCHAR[Buflen + 1];
     
    pAdInfo_c = pAdInfo;
     
     
     
    [/size][size=2][color=#008000]//Si la commande GetAdaptersInfo c'est déroulée avec Success
     
    [/color][/size][size=2][color=#0000ff]if[/color][/size][size=2] (GetAdaptersInfo(pAdInfo, &Buflen) == ERROR_SUCCESS) {
     [/size][indent][size=2][color=#0000ff]do[/color][/size][size=2] {
     [/size][indent][size=2][color=#008000]//On récupère l'IP lié à l'adapter en cours
     
    [/color][/size][size=2]IP = inet_addr(pAdInfo->IpAddressList.IpAddress.String);
     
    [/size][size=2][color=#008000]//Si celle si n'est pas null ou différente de 127.0.0.1
     
    [/color][/size][size=2][color=#0000ff]if[/color][/size][size=2] ((IP != 0) && (IP != 0x7f000001)) {
     [/size][indent][size=2][color=#008000]//On incrémente le compteur d'adapter parcouru
     
    [/color][/size][size=2]nAdapterCount++;
     
    [/size][size=2][color=#008000]//Si le numéro d'adapter est égale à celui que l'on désire
     
    [/color][/size][size=2][color=#008000]//Ou 0 pour le premier
     
    [/color][/size][size=2][color=#0000ff]if[/color][/size][size=2] ((nAdapterCount == AdapterID) || (AdapterID == 0)) {
     [/size][indent][size=2][color=#008000]//Si la MAC Address à une longueur supérieure à 0 donc existante
     
    [/color][/size][size=2][color=#0000ff]if[/color][/size][size=2] (pAdInfo->AddressLength != 0) {
     [/size][indent][size=2][color=#008000]//Pointeur de caractère qui contiendra la MAC Address
     
    [/color][/size][size=2][color=#0000ff]char[/color][/size][size=2]* MACStr;
     
    [/size][size=2][color=#008000]//Initialisation du pointeur
     
    [/color][/size][size=2]MACStr = [/size][size=2][color=#0000ff]new[/color][/size][size=2][color=#0000ff]char[/color][/size][size=2][256];
     
    [/size][size=2][color=#008000]//On place tout les octets à 0 pour être sur qu'il n'y ai pas de crasses
     
    [/color][/size][size=2]memset(MACStr,'\0',256);
     
    [/size][size=2][color=#008000]//On boucle sur chaque partie de la MAC
     
    [/color][/size][size=2][color=#0000ff]for[/color][/size][size=2] ([/size][size=2][color=#0000ff]int[/color][/size][size=2] i = 0; i < ([/size][size=2][color=#0000ff]int[/color][/size][size=2])pAdInfo->AddressLength; i++) {
     [/size][indent][size=2][color=#008000]//Pointeur de caractère qui contiendra la partie en cours de la MAC
     
    [/color][/size][size=2][color=#0000ff]char[/color][/size][size=2]* Temp;
     
    [/size][size=2][color=#008000]//Initialisation du pointeur
     
    [/color][/size][size=2]Temp = [/size][size=2][color=#0000ff]new[/color][/size][size=2][color=#0000ff]char[/color][/size][size=2][256];
     
    [/size][size=2][color=#008000]//Ecriture dans Temps de la partie de la MAC en cours (En hexa sur 2 Digits)
     
    [/color][/size][size=2]sprintf(Temp,":%02X",pAdInfo->Address[i]);
     
    [/size][size=2][color=#008000]//En ajoute la partie à la MAC complète
     
    [/color][/size][size=2]strcat(MACStr,Temp);
     
    [/size][size=2][color=#008000]//On supprime le pointeur
     
    [/color][/size][size=2][color=#0000ff]delete[/color][/size][size=2] Temp;
    [/size][/indent][size=2]}
     
    [/size][size=2][color=#008000]//Suppression du pointeur pAdInfo
     
    [/color][/size][size=2][color=#0000ff]delete[/color][/size][size=2] pAdInfo;
     
    [/size][size=2][color=#008000]//On retourne la MAC Address obtenu
     
    [/color][/size][size=2][color=#0000ff]return[/color][/size][size=2] MACStr + 1;
    [/size][/indent][size=2]}
    [/size][/indent][size=2]}
    [/size][/indent][size=2]}
    [/size][/indent][size=2][color=#008000]//On boucle tant que il existe un autre adapter & qu'il est différent du précédent
     
    [/color][/size][size=2]} [/size][size=2][color=#0000ff]while[/color][/size][size=2] ((pAdInfo->Next != NULL) && ((pAdInfo = pAdInfo->Next) != pAdInfo));
    [/size][/indent][size=2]}
     
    [/size][size=2][color=#008000]//On supprime le pointeur pAdInfo_c
     
    [/color][/size][size=2][color=#0000ff]delete[/color][/size][size=2] pAdInfo_c;
     
    [/size][size=2][color=#008000]//On retourne NULL (aucune MAC Address de trouvé)
     
    [/color][/size][size=2][color=#0000ff]return[/color][/size][size=2] NULL;
    [/size][/indent][size=2]}
     
    [/size]
    Example d'utilisation :

    Code:
    [size=2][color=#0000ff]int[/color][/size][size=2][color=#000000] _tmain([/color][/size][size=2][color=#0000ff]int[/color][/size][size=2][color=#000000] argc, _TCHAR* argv[])[/color]
    
    {
    [/size][indent][size=2][color=#0000ff]char[/color][/size][size=2]* MACAddr;
    
    MACAddr = [/size][size=2][color=#0000ff]new[/color][/size][size=2][color=#0000ff]char[/color][/size][size=2][256];
    
    MACAddr = GetMacAddress(0);
    
    std::cout << MACAddr;
    
    system("PAUSE");
    
    [/size][size=2][color=#0000ff]return[/color][/size][size=2] 0;
    
    [/size][/indent][size=2]}
    
    [/size]
    neku, 11 Janvier 2007
    #1
  2. Offline
    Froggy fake geek
    euh ... d'accord ! :)

    mais ou est ton problème la dedans ? :-D
    Froggy, 11 Janvier 2007
    #2
  3. Offline
    II phl II Touriste
    Il n'a aucun problème (du moins il n'en a pas l'air :proud:)

    Il partage tout simplement les fruits de son savoir :p
    II phl II, 11 Janvier 2007
    #3
  4. Offline
    neku Codeur roumain
    C'est bien ca ;)
    neku, 11 Janvier 2007
    #4
  5. Offline
    Ahava Revenant
    Sympatique :)


    Tiens, ca me donne une idée, pk pas faire une sorte de "bibliotheques" des codes, programmes & co comme j'ai fait pour les liens, mais en faisant les liens vers les threads déjà postés ?

    Je l'aisse l'honneur à quiconque veut le faire, je m'occupe déjà du post des liens :)
    Ahava, 11 Janvier 2007
    #5
  6. Offline
    neku Codeur roumain
    Petites modifs :

    Code:
    return MACStr;
    
    devient
    Code:
    return MACStr + 1;
    
    Pour éviter l'espace/":" devant la premiere partie de la MAC

    Code:
    sprintf(Temp, " %02X", pAdInfo->Address[i]);
    devient
    Code:
     sprintf(Temp, ":%02X", pAdInfo->Address[i]);
    C'est plus beau séparé par des ":"
    neku, 11 Janvier 2007
    #6
Statut de la discussion:
Fermée.