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.
Et pourquoi tu rajoute LgrChaine à szCn? Ca sert a quoi?
Tu peu m'éclairer sur la fonction GetMAc que tu as fais. Comment elle fonctionne ?
Merci
Je ne m'en souviens plus ! Si ça me revient, je t'en ferai part.Envoyé par Général03
Elle répond précisément à ta question initiale : "je souhaite récupérer l'adresse MAC d'un hôte distant en connaissant son adresse IP " Sauf que l'adresse IP à fournir à GetMAC l'est sous la forme binaire (DWORD).Envoyé par Général03
Merci de me répondre quand tu as plus d'infos.
Merci beaucoup car ta fonction tourne super par contre certaines fois je n'obtiens rien (00:00:00...)
Peut être parce que tu ping une adresse sur un autre réseau et là, on ne risque pas de récupérer l'adresse MAC.Envoyé par Général03
Bonjour,
J'ai impérativement besoin de ce programme. Mais je n'ai pas le temps de le réaliser. Serait-il possible de me l'envoyer par e-mail ? Veuillez me demander mon e-mail par mp !! Svp c'est urgent !
OK je te l'ai envoyer par mail et dsl je croyai que tu n'avais pas poser de post...
Le souci est que tu n'obtiens rien qd tu passe un routeur...si t'as une solution pr y remedié
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);
Evidemment, la seule adresse MAC que tu pourras connaître est... celle de ton routeur ! Et ça, tu ne pourras jamais dépasser cette contrainte, à moins de construire une appli client/serveur avec un service tournant sur le poste distant.Envoyé par Général03
Partager