Bonjour,
je souhaite récupérer l'adresse MAC d'un hôte distant en connaisant son adresse IP sans utiliser DOS ou des codes à ralonge.
Quelqu'un aurait une solution à mon pb?
Merci
Bonjour,
je souhaite récupérer l'adresse MAC d'un hôte distant en connaisant son adresse IP sans utiliser DOS ou des codes à ralonge.
Quelqu'un aurait une solution à mon pb?
Merci
Voici ce qu'on peut faire, par exemple, en utilisant IPHLPAPI.DLL :La fonction SendARP de iphlpapi est invoquée avec en paramètre l'adresse IP dont on veut connaître l'adresse MAC. Puis on convertit le résultat se trouvant dans pulMac en une adresse lisible et on retourne une AnsiString.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #pragma link "C:\\Program Files\\Borland\\CBuilder5\\Lib\\PSDK\\iphlpapi.lib" // il s'agit ici bien sûr de Builder 5 ...... ...... AnsiString __fastcall TForm1::GetMAC(DWORD ipAddr) { ULONG pulMac[2]; ULONG ulLen; AnsiString AsMAC = "00:00:00:00:00:00"; memset (pulMac, 0xff, sizeof (pulMac)); ulLen = 6; if (SendARP (ipAddr, 0, pulMac, &ulLen)) // erreur return "00:00:00:00:00:00"; size_t i, j; char *szMac = new char[ulLen * 3]; PBYTE pbHexMac = (PBYTE) pulMac; for (i = 0, j = 0; i < ulLen - 1; ++i) j += wsprintf (szMac + j, "%02X:", pbHexMac[i]); wsprintf (szMac + j, "%02X", pbHexMac[i]); AsMAC.sprintf("%s", szMac); delete [] szMac; return AsMAC; }
J'ai omis de préciser que l'adresse IP attendue en paramètre de TForm1::GetMAC étant un DWORD et nom une adresse de type chaine de caractères, je fournis ci-dessous une fonction pour convertir convenablement cette adresse par :afin d'utiliser aIP dans l'appel à GetMAC. Voici la fonction IPStrToInt() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DWORD aIP = IPStrToInt(Edit1->Text); AnsiString StrMAC = GetMAC(aIP);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 // CONVERTIR @IP CHAINE EN ADRESSE IP DWORD // Sait gérer des adresses sous la forme 192.168.001.021 DWORD __fastcall TForm1::IPStrToInt(AnsiString As) { char szChaine[16], *szCn[4]; int LgrChaine, i, j; strcpy(szChaine, As.c_str()); if ((LgrChaine = strlen(szChaine)) > 15) return 0; for (i=1 ; i<4 ; i++) szCn[i] = szChaine + LgrChaine; // chaine vide szCn[0] = szChaine; for (i = 0 , j = 1 ; szChaine[i] != 0 && j < 4 ; i++) { if (szChaine[i] == '.') { szChaine[i] = '\0'; szCn[j++] = szChaine + i + 1; } } for (i=0 ; i<4 ; i++) if (StrToInt(szCn[i]) > 255) { Beep(); ShowMessage("Adresse invalide"); return 0; } return StrToInt(szCn[0]) + (StrToInt(szCn[1])<<8) + (StrToInt(szCn[2])<<16) + (StrToInt(szCn[3])<<24); }
Merci de ton aide mais je n'arrive pas à inclure la dll au projet. Il ne connait pas la fonction SendARP.
Merci de ta réponse
J'ai réussi a inclure la dll car j'avais oublié de mettre l'entête .h
Ton prog marche et c'est super merci beaucoup. Par contre je ne comprend pas à quoi sert la variable "szCn" dans ta fonction GetMAC, tu ranges quoi à l'intérieur?
for (i=1 ; i<4 ; i++)
szCn[i] = szChaine + LgrChaine;
szCn[0] = szChaine;
Merci de ta réponse
szCn est un tableau de 4 chaines de caractères dans lesquelles vont être stockées chacune des 4 chaines représentant les sous-chaines de l'adresse IP sous forme alpha.
Par exemple, dans l'adresse 192.168.123.234, szCn[0] pointe sur "192", szCn[1] pointe sur "168", szCn[2] pointe sur "123", szCn[3] pointe sur "234".
Il est ensuite aisé d'utiliser ces 4 chaines que l'on convertit en valeurs numériques dans le return de fin.
J'ai créer ce programme avec le même code exactement, mais maintenant, où est-ce que je peux lui donner l'adresse IP et par où je reçois l'adresse MAC ?
Utilise d'abord la fct IPStrToInt en placant ton @IP en AnsiString en paramètre et il te retourne cette derniere en DWORD.
Après tu utilises la fonction GetMAC ou tu rentres ton adresse IP (variable DWORD) ds son paramètre. Enfin il te retourne l'adresse magique....
Salut,
Pour appeler les fonctiones j'ai fait ceci :Pour la première fonction cela fonctionne, mais je sais pas comment mettre la valeur DWORD retournée par la première fonction dans le parametre de la deuxième. J'ai essayé de mettre "szCn" c'est ce qui est retourné par la première mais cela ne fonctionne pas. Je dois y mettre quoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { IPStrToInt("xxx.xxx.xxx.xxx"); GetMAC(???); } //---------------------------------------------------------------------------
Merci
La variable StrMAC retourne ton adresse physiqueDWORD aIP = IPStrToInt (192.168.0.15);
AnsiString StrMAC = GetMAC(aIP);
Partager