[HELP] GetIpAddrTable

ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004 - 26 mai 2004 à 14:25
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 26 mai 2004 à 16:55
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2004 à 14:49
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++
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
26 mai 2004 à 15:16
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2004 à 15:28
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++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2004 à 15:35
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++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
26 mai 2004 à 15:35
Merci je vais essayer ca tou de suite
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
26 mai 2004 à 16:15
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 @+
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
26 mai 2004 à 16:17
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?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2004 à 16:21
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++
0
ghost260984 Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 14 décembre 2004
26 mai 2004 à 16:48
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 ;-)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mai 2004 à 16:55
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++
0
Rejoignez-nous