Récupérer l'adresse IP de mon PC

Résolu/Fermé
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 - 27 mai 2008 à 09:43
 Stephen - 9 sept. 2008 à 11:29
Bonjour,
je souhaite concevoir un script en C qui me permettra ceci :

-récupération de l'adresse IP de la machine attribuée par le serveur DNS
-interrogation du serveur DNS pour savoir quel est son nom d'hôte grâce à son adresse IP (d'où le besoin précédent...)

étant débutant en C, pourriez vous me donner quelques pistes à suivre s'ils vous plait?

15 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
27 mai 2008 à 16:14
Salut.
utilise inet_addr() (dans windows.h ou arpa/inet.h)
sockaddr_in a;
a.sin_addr.s_addr=htonl(INADDR_ANY);
Ton adresse IP est alors contenu dans "a.sin_addr.s_addr"
Ensuite, il faut utiliser la bonne conversion pour l'afficher sous la forme d'une IP en 4 morceau.
ensuite, pour le nom DNS, tu peux utiliser gethostbyaddr()
d'après le man, il faut plutot utiliser la structure hostent.
1
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
27 mai 2008 à 16:42
Merci Char Snippeur, peux tu m'expliquer comment utiliser inet_addr... car je regarde la doc sur le net mais j'ai du mal à la comprendre à vrai dire... (noob dans la place!).

Concrètement, dans une application en C comment dois je l'utiliser?

Merci de ton aide!!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 mai 2008 à 10:13
Quel est le type de INADDR_ANY ? bien entendu, c'est UNE adresse IP, en as tu plusieurs ? (tu as l'adresse réseau classique lorsque tu as ne carte, et la boucle localhost en 127.0.0.1, INADDR_ANY prend normalement l'adresse du réseau par défaut et pas la boucle locale)
Si oui, essai avec la fonction gethostbyname() avec "localhost" comme nom, et toute les adresses devraient être contenues dans la structure hostent.
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
28 mai 2008 à 10:33
Lorsque je compile mon programme j'obtiens ceci :

c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\récupérer l'adresse ip\récupérer l'adresse ip\récupérer l'adresse ip.cpp(11) : error C2664: 'inet_ntoa' : impossible de convertir le paramètre 1 de 'u_long' en 'in_addr'
Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë

et ligne 11 j'ai :

inet_ntoa(htonl(INADDR_ANY));

Autre chose, pour récupérer et stocker ce résultat je peux utiliser une variable chaine de caractère comme ceci :
adresseIP=inet_ntoa(htonl(INADDR_ANY)); ?
Après il me resterait à analyser ce tableau avec des boucle du genre TANTQUE pour en isoler les 4 parties...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 mai 2008 à 11:53
dans la page de man :
struct in_addr {
               unsigned long int s_addr;
           }

donc, un bon cast bien bourrin devrai fonctionner, ou alors :
in_addr tmp;tmp.s_addr=htonl(INADDR_ANY);
puis tu affect :
adresseIP=inet_ntoa(tmp);
Pourquoi veux tu isoler les 4 parties ?
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
28 mai 2008 à 13:23
Avec ce code :

#include "stdafx.h"
#include "windows.h"


int _tmain( int argc, _TCHAR* argv[] )
{
char adresseIP;
in_addr tmp;
tmp.s_addr=htonl(INADDR_ANY);
adresseIP=inet_ntoa(tmp);
adresseIP;
}

J'ai encore cette erreur...

c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\récupérer l'adresse ip\récupérer l'adresse ip\récupérer l'adresse ip.cpp(13) : error C2440: '=' : impossible de convertir de 'char *' en 'char'
Aucun contexte dans lequel cette conversion est possible

En c# j'aurais déclaré adresseIP en string mais ya pas ça en c++ alors je sais pas comment faire...
Je veux récupérer l'adresse IP en 4 partie après car il va me faloir ensuite utiliser la partie host pour que le DNS me fournisse un hostname en fonction de l'adresse IP (et plus particulièrement de la partie host...)

NB : et si la machine possède plusieurs carte réseau... comment le programme va t-il gérer cela??
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 mai 2008 à 14:18
Et si, string existe en C++ !
#include <string>
puis :
std::string adesseIP=inet...
une chaine de caratère, c'est un pointeur sur un caractère, donc de type char* pas char !

Si le PC a plusieurs cartes réseau, il prend une adresse au hasard.
Voir gethostbyname et struct hostent si tu veux toutes les récupérer.

Le C# il vau mieu éviter.
0
Désolé de m'incruster dans la conversation mais j'ai entendu dire que lorsqu'il y avait plusieur carte réseau, l'addresse ip était choisie au hasard ? L'adresse ip ne peut elle pas rester statique (fixe) malgrés plusieurs carte réseau ? Peut on alors par inversement choisir une autre adresse ip malgrés que l'on posséde qu'une carte réseau ? car j'ai entendu qu'il existerait des adresses ip qui changerai a chaque connexe=ion et sans doute elle serai défini par le serveur dns.
Merci de bien vouloir me répondre car je n'ai jamais trouvé de réponse claire dessus.
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244 > Jean
28 mai 2008 à 15:59
Désolé mais perso je n'ai pas la réponse à cela...

Au sujet du string, le compilateur me dit qu'il ne parvient pas à trouver string.h... où le trouver??
0
Jean > julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015
28 mai 2008 à 16:03
Bonjour julow je me demandai si une fois que ton code sera fini si tu pouvai me le passer pourr mon projet ?
Merci à toi!!
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244 > Jean
28 mai 2008 à 16:24
Pas de problème... Mais faut déjà que je le termine parce que je patoge en C++!
Une solution Char Snippeur?
0
Jean > julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015
29 mai 2008 à 17:06
Merci beacoup à toi !!
0

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

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 mai 2008 à 17:11
Tu compile en quoi ?
fait une recherche sur le disque dur de string.h, il doit être dans include.
Jean, j'ai rien compris !
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
29 mai 2008 à 08:36
Je compile avec Visual C++. Donc en mode c++ (normal quoi...).
Le header string.h est bien présent mais pourtant il est sauté lors de l'exécution... étrange! On me dit de recompiler l'en tête ou d'ajouter le header stdafx.h (ce qui est déjà fait...).
Je comprends plus rien là!

Voici mon code actuel :

#include <string.h>
#include <stdafx.h>
#include <windows.h>


int _tmain( int argc, _TCHAR* argv[] )
{
string adresseIP;
in_addr tmp;
tmp.s_addr=htonl(INADDR_ANY);
adresseIP = inet_ntoa(tmp);
adresseIP;
}
0
"tu compile en quoi": mon projet est établi sur les identitées numérique et j'aimerai bien trouver un algo qui fonctionne dessus comme un algo sur l'ip. Merci
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 mai 2008 à 10:49
soit, mais tu l'ajoute apres ton stdafx.h
En plus, moi je t'avai dit d'inclure <string> pas <string.h>, tu fait du C++.
Et n'oublie pas le std:: devant string lors de la déclaration !
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
29 mai 2008 à 13:34
Lorsque je fais comme tu le dis, le compilateur de VC++ 2008 express me donne tout ceci comme message d'erreur et warning...

------ Début de la génération : Projet : test, Configuration : Debug Win32 ------
Compilation en cours...
test.cpp
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(1) : warning C4627: '#include <string>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
Ajoutez la directive à 'stdafx.h' ou régénérez l'en-tête précompilé
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(2) : warning C4627: '#include <windows.h>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
Ajoutez la directive à 'stdafx.h' ou régénérez l'en-tête précompilé
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(5) : error C2653: 'std' : n'est pas un nom de classe ni d'espace de noms
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(5) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'adresseIP'
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(5) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(5) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(9) : error C2065: 'in_addr' : identificateur non déclaré
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(9) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'tmp'
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(9) : error C2065: 'tmp' : identificateur non déclaré
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(10) : error C2065: 'tmp' : identificateur non déclaré
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(10) : error C2228: la partie gauche de '.s_addr' doit avoir un class/struct/union
le type est ''unknown-type''
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(10) : error C2065: 'INADDR_ANY' : identificateur non déclaré
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(10) : error C3861: 'htonl' : identificateur introuvable
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(11) : error C2653: 'std' : n'est pas un nom de classe ni d'espace de noms
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(11) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'adresseIP'
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(11) : error C2065: 'tmp' : identificateur non déclaré
c:\documents and settings\stagiaire\mes documents\visual studio 2008\projects\test\test\test.cpp(11) : error C3861: 'inet_ntoa' : identificateur introuvable
Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\stagiaire\Mes documents\Visual Studio 2008\Projects\test\test\Debug\BuildLog.htm"
test - 15 erreur(s), 2 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


Et voici mon code...

#include <string>
#include <windows.h>
#include <stdafx.h>

std::string adresseIP;

int _tmain( int argc, _TCHAR* argv[] )
{
in_addr tmp;
tmp.s_addr=htonl(INADDR_ANY);
std::string adresseIP = inet_ntoa(tmp);
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 mai 2008 à 15:04
mon opinion est conforté : Visual C++ c'est vraiment de la merde !
"en-tête précompilé" jamais entendu parlé de ça en C++ ! Même pas foutu de compiler des sources en iso-C++ !
Soit tu utilise un vrai compilateur C++ (gcc, borland ...) soit tu trouves quelqu'un qui s'y connait en Micro$oft (=petit mou, c'est dire).
Bonne chance.
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
29 mai 2008 à 15:09
Je vais tenter avec Dev C++...

Je te redis ça!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 mai 2008 à 15:18
Ha ! Bah voila qui est mieux.
N'oublie pas de lier avec libws2_32.a lors de la compilation pour pouvoir utiliser les sockets.
0
Hallucinant de lire des âneries parailles
Quand on n'est pas foutu d'utiliser le meilleur IDE-compîlateur-debugger professionnel du marché, il vaut mieux s'abstenir de tout commentaire, pour paraitre moins abruti...
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
30 mai 2008 à 11:54
Je compile avec Dev Cpp 5 en mode C (car finalement pour des raisons de sécurité et de simplicité je fais ce programme en C...).

Pour ce qui est de lister les interfaces réseaux j'ai enfin réussi. Pareil pour l'adresse MAC d'ailleurs!
Mais actuellement je bloque sur l'adresse IP... L'adresse IP qui s'affiche n'est pas celle de mon interface ethernet et celle de loopback est fausse donc il y a un problème quelque part mais je ne parviens pas à voir où... Je vous tiens au courant et une fois terminé je vous donne le code source!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 mai 2008 à 12:28
Dit nous déjà comment tu as fait pour les réseau et les adresses MAC.
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
3 juin 2008 à 09:35
D'abord j'ai utiliser la table MIB_IFTABLE pour récupérer des info sur toutes mes interfaces réseau.

Ensuite j'ai gardé seulement celle qui correspond à la carte Ethernet puis j'ai les structure MIB IPADDRTABLE et IPADDRROW pour récupérer l'adresse IP et MAC de ma carte.

Toute la doc sur ces tables et structure sont sur MSDN avec des exemples!
0
c st un truc de fou les tronches qui y a sur ce genre de site déstiné a rendre servise aux autres ... j en suis bouche bée ^^ merci a tous les modos qui gerent la fougere dans ce domaine, j aimerais bien toucher le quart des trucs que vous pouvez aborder, vous etes vraiment fortiche les gars ^^ (j'vous kiff les gens qui s y connaisse, j aimerais bien en connaitre autant que vous ^^
0
Un traitement aussi basique que récupérer l'IP, c'est fou ce qu'il faut être une "tronche"
Il y a de ces quiches...
0
juste pour féliciter les gens qui on les connaissances adéquat pour rendre service a tous ^^ merci et a bientôt ^^j'espère
0
marc[i1] Messages postés 2573 Date d'inscription vendredi 1 avril 2005 Statut Contributeur Dernière intervention 6 septembre 2008 382
27 mai 2008 à 09:48
Salut,

Sous Windows :
ipconfig


Sous Linux / MacOS :
ifconfig

-1
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
27 mai 2008 à 10:03
Nan nan nan...

Le truc c'est que je souhaite automatiser cela.
Ce que je veux c'est que en utilisant ce programme en C, la machine récupère son adresse IP et ensuite utilise celle ci pour que grâce à un Get host by adr elle puisse avoir un nom d'hôte que va lui fournir le serveur DNS (en fonction de son IP)
Donc il me faut savoir comment récupérer cette adresse IP via un script C et pas en batch.

Merci!
0
Si ça peut aider; code Microsoft

//
// Link with IPHlpAPI.lib
//
#include <stdio.h>
#include <windows.h>
#include <iphlpapi.h>

main() {

FIXED_INFO * FixedInfo;
ULONG ulOutBufLen;
DWORD dwRetVal;
IP_ADDR_STRING * pIPAddr;

FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
ulOutBufLen = sizeof( FIXED_INFO );

if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {
GlobalFree( FixedInfo );
FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );
}

if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {
printf( "Call to GetNetworkParams failed. Return Value: %08x\n", dwRetVal );
}
else {
printf( "Host Name: %s\n", FixedInfo -> HostName );
printf( "Domain Name: %s\n", FixedInfo -> DomainName );

printf( "DNS Servers:\n" );
printf( "\t%s\n", FixedInfo -> DnsServerList.IpAddress.String );

pIPAddr = FixedInfo -> DnsServerList.Next;
while ( pIPAddr ) {
printf( "\t%s\n", pIPAddr ->IpAddress.String );
pIPAddr = pIPAddr ->Next;
}
}
exit( 0 );
}
-1
Salut

pour completer marcien ipconfig va te donner l'ip en effet ainsi que l'adresse mac l'adresse physique de la carte reseau

ainsi pour le nom d'hote à partir de l'adresse ip c'est nslookup site web

exemple nslookup www.google.fr

pour l'ip à partir du nom d'hote http://pagesperso-orange.fr/korytion/linux.html#a20 c'est la commande host site web
sous nux.

exemple host www.google.fr

Cette commande n'existe que sous nux malheureusement

Pour le réseau rien ne vaut Linux
-1
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
27 mai 2008 à 10:38
C'est bien gentil mais moi ce que je veux c'est l'inverse... Récupérer mon adresse IP pour attribuer son host name à un PC... Pas l'inverse!
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244 > julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015
27 mai 2008 à 10:57
Apparament il faut que je liste mes interface réseau avant...
Selon the GNU C library il me faut utiliser la fonction struct if_nameindex... mais je comprend rien!! Comment elle s'utilise! Ya pas d'exemple je nage!
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244 > julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015
27 mai 2008 à 15:47
Au pire, je peux le faire en C++. Le truc c'est que là aussi je ne sais pas comment me servir du C++ pour accéder aux ressources reseau...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 mai 2008 à 08:34
http://www.linux-france.org/article/man-fr/man3/inet_addr-3.html
en fait, j'ai confondu, inet_addr() sert dans ce sens là :
a.sin_addr.s_addr=inet_addr("192.168.0.1");
en fait, toi, si tu veux réupérer l'IP, essai :
inet_ntoa(htonl(INADDR_ANY));
qui devrai renvoyer une chaine de caractères.
-1
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
28 mai 2008 à 09:49
Merci Char Snipeur!!
Donc si je récapitule, (attention un noob va parler!) :

On dit avec INADDR_ANY d'utiliser l'adresse IP locale,
en faisant htonl(INADDR_ANY) on convertit l'entier long obtenu,
et en faisant inet_ntoa(htonl(INADDR_ANY)) on récupère ce résultat en chaine de caractères...

Mais je ne comprend pas l'utilité de htonl... Si inet_ntoa convertit l'adresse en chaine de caractère et que INADDR_ANY représente cette adresse locale alors à quoi sert htonl?? De plus j'ai regardé sur le net, INADDR_ANY représente UNE adresse locale... Et pas celle que la machine utilise sur le réseau, non?

(je suis un peu perdu en fait car moi je touche plus au C# qu'au C++ mais ici on m'impose d'utiliser le C++...)
0