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

Statut
N'est pas ouverte pour d'autres réponses.

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]
 

Froggy

fake geek
euh ... d'accord ! :)

mais ou est ton problème la dedans ? :-D
 

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
 
1er
OP
neku

neku

Codeur roumain
II phl II a dit:
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
C'est bien ca ;)
 

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 :)
 
1er
OP
neku

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 ":"
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut