[HELP] GetIpAddrTable

Signaler
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
J ai creer un projet en VB qui entre autre récupérait l'adresse IP reso de la machine grace a l API GetIpAddrTable , maintenant je réutilise cette API en c++ et les résultat de l API sont differents , et donc je ne trouve plus l adresse IP de la machine .
Voici le code de ma fonction :

char* sGetIP()
{
PMIB_IPADDRTABLE IpAddrTable;
unsigned long len=sizeof(IpAddrTable);
unsigned long* size=&len;
char* resultat;
char* temp;
bool order=true;
byte tab[4];

IpAddrTable = new MIB_IPADDRTABLE;
resultat = new char[1];
temp = new char[1];

GetIpAddrTable(IpAddrTable,size,order);

CopyMemory(tab,&IpAddrTable->table[i].dwAddr ,4);

itoa(tab[0],resultat,10);
strcat(resultat,".");
itoa(tab[1],temp,10);
strcat(resultat,temp);
strcat(resultat,".");
itoa(tab[2],temp,10);
strcat(resultat,temp);
strcat(resultat,".");
itoa(tab[3],temp,10);
strcat(resultat,temp);

return resultat;
}

Si quelqu un a une solution a me proposer n esitez pas!

voila voila et merci d avance!

10 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
On voit que c'est du trancrit de VB, va falloir oublier complet le VB.
Regarde GetIpAddrTable() dans MSDN, exemple complet y est donne.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

En fait je n ai pas d exemple dans msdn , j ai juste le prototype de l API , mais que fasse appel a une API window avec vb ou c ou delphi je devrait avoir le meme resultat qui est l adresse IP de ma machine or ici ce n est pas le cas , donc je voulais savoir si quelqu un avait deja utiliser cette api afin de voir ou j avais fait une erreur.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
The following example retrieves the IP address table, then adds the IP address 192.168.0.27 to the first adapter. The IP address that was added is then deleted.

// Before calling AddIPAddress we use GetIpAddrTable to get
// an adapter to which we can add the IP.
PMIB_IPADDRTABLE pIPAddrTable;
DWORD dwSize = 0;

pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) );

// Make an initial call to GetIpAddrTable to get the
// necessary size into the dwSize variable
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
GlobalFree( pIPAddrTable );
pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
}

// Make a second call to GetIpAddrTable to get the
// actual data we wantif ( (dwRetVal GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) NO_ERROR ) {
printf("\tAddress: %ld\n", pIPAddrTable->table[0].dwAddr);
printf("\tMask: %ld\n", pIPAddrTable->table[0].dwMask);
printf("\tIndex: %ld\n", pIPAddrTable->table[0].dwIndex);
printf("\tBCast: %ld\n", pIPAddrTable->table[0].dwBCastAddr);
printf("\tReasm: %ld\n", pIPAddrTable->table[0].dwReasmSize);
}
else {
printf("Call to GetIpAddrTable failed.\n");
}

// IP and mask we will be adding
UINT iaIPAddress;
UINT imIPMask;

iaIPAddress = inet_addr("192.168.0.27");
imIPMask = inet_addr("255.255.255.0");

// Variables where handles to the added IP will be returned
ULONG NTEContext = 0;
ULONG NTEInstance = 0;

if ( (dwRetVal = AddIPAddress(iaIPAddress,
imIPMask,
pIPAddrTable->table[0].dwIndex,
&NTEContext,
&NTEInstance) ) == NO_ERROR) {
printf("\tIP address added.\n");
}

else {
printf("Error adding IP address.\n");

LPVOID lpMsgBuf;
if (FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwRetVal,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL )) {
printf("\tError: %s", lpMsgBuf);
}
LocalFree( lpMsgBuf );
}

// Delete the IP we just added using the NTEContext
// variable where the handle was returnedif ((dwRetVal DeleteIPAddress(NTEContext)) NO_ERROR) {
printf("\tIP Address Deleted.\n");
}
else {
printf("\tCall to DeleteIPAddress failed.\n");
}

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
resultat = new char[1];
et plus bas
strcat(resultat,temp);
NENNI, strcat RIEN DU TOUT sur 1 SEUL octet, il en faut au moins 2 pour faire une chaine.
Commence par apprendre le C sinon tu ne pourras pas avancer.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

Merci je vais essayer ca tou de suite
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

le language ne m interdit pas de faire des chaines de 1caracteres ni de faire des copie de chaines de la meme taille mais au depart ces chaines etaient destinnees a autres chose et puis je les aient reutilisee comme ca pour les preservee mais elle n ont plus raison d etre alors je vais modifier ca

merci @+
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

je reviens 2 secondes sur ce que j ai dit en fait un tableau est un pointeur sur une zone de la memoire si cette zone se resume a un octet ce n est pas genant j aurais un pointeur sur un caractere donc cela ne gene en rien mon code , a moins que je n ai tort?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Tout a fait tort, si 1 seul octet alors ZERO caractere puisque c'est juste la place pour le ZERO final.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
20
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
14 décembre 2004

tout a fait d accord mais dans cet exemple ce n ai pas bien genant car le strcat redimmenssionne mon tableau de caractere a la taille voulue , mais c est vrai ke si je voulais y mettre un caractere la j aurais des petits soucis , mais en fait je viens de me souvenir pourkoi j ai un tableau de un caractere , en fait c est juste que quand j utilise un tableau dans strcat celui ci doit etre initialise auparavant donc j ai creer le tableau le plus petit possible afin de ne pas prendre de memoire inutilement ( zen fait c etait pour ca c etait juste de la bidouille ;-)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Je repete, AUCUN strcat sur un char[1] et pour quelque raison que ce soit.
Ensuite tu fais comme tu veux, on ne peut pas t'obliger mais faudra pas chercher le bug bien loin, il y aura forcement ecrasement de donnees.

ciao...
BruNews, Admin CS, MVP Visual C++