Rechercher : dans
Par :

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

Dernière réponse le 24 sep 2008 à 11:14:35 julow, le 27 mai 2008 à 09:43:58 
 Signaler ce message aux modérateurs

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?

Meilleures réponses pour « Récupérer l'adresse IP de mon PC » dans :
[RegExp] Récupérer une adresse IP Voir Finalité Mise en œuvre Explications Interprétation du motif Récupérer une adresse IP Finalité Pour récupérer une IP dans un fichier texte, fichiers journaux, pages web, etc. Mise en œuvre L'expression régulière suivante combinée à la...
Adresse IP Fixe sous Windows XP VoirBien souvent, il est nécessaire d'avoir une adresse IP fixe, en particulier dans le cas où on a un réseau comptant plusieurs PC chez soi. Pour cela, il faut récupérer ces informations en faisant : Démarrer Exécuter et taper « cmd » puis...
[Shell] Récupérer son IP publique VoirFinalité Pour plusieurs raisons, on peut avoir besoin de récupérer son adresse IP publique dans un script. Le problème qui se pose alors si l'on est sur un LAN, est de trouver cette IP sans interventions humaine. Mise en œuvre Le moyen le plus...
Comment connaitre son adresse IP ? VoirLes quelques commandes ci-dessous vous permettront de trouver l'adresse IP de votre ordinateur. Connaître son adresse IP Sous Windows 2000 / Windows XP / Windows Vista Sous Windows 95 / Windows 98 Sous Linux Pourquoi certains sites...
Adresse IP VoirSommaire Qu'est-ce qu'une adresse IP Déchiffrement d'une adresse IP Adresses particulières Les classes de réseaux (obsolète) Classe A Classe B Classe C Attribution des adresses IP Adresses IP réservées Masques de sous-réseau Interet...
Usurpation d'adresse IP (Mystification / Spoofing) VoirL'usurpation d'adresse IP L'« usurpation d'adresse IP » (également appelé mystification ou en anglais spoofing IP) est une technique consistant à remplacer l'adresse IP de l'expéditeur d'un paquet IP par l'adresse IP d'une autre machine. Cette...

1

marc[i1], le 27 mai 2008 à 09:48:45
  • +1

Salut,

Sous Windows :

ipconfig


Sous Linux / MacOS :
ifconfig


Archlinux ... Une distribution légère, rapide et KISS sur ar­chlinux.fr

Répondre à marc[i1]

4

julow, le 27 mai 2008 à 10:03:15

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!

Répondre à julow

2

Evariste, le 27 mai 2008 à 09:59:27

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 );
}

Répondre à Evariste

3

korytion, le 27 mai 2008 à 10:02:50

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

Répondre à korytion

5

julow, le 27 mai 2008 à 10:38:07

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!

Répondre à julow

6

julow, le 27 mai 2008 à 10:57:59

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!

Répondre à julow

7

julow, le 27 mai 2008 à 15:47:44

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...

Répondre à julow

8

Char Snipeur, le 27 mai 2008 à 16:14:41

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

9

julow, le 27 mai 2008 à 16:42:20

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!!

Répondre à julow

10

Char Snipeur, le 28 mai 2008 à 08:34:02

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

11

julow, le 28 mai 2008 à 09:49:53

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++...)

Répondre à julow

12

Char Snipeur, le 28 mai 2008 à 10:13:26

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

13

julow, le 28 mai 2008 à 10:33:55

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...

Répondre à julow

14

Char Snipeur, le 28 mai 2008 à 11:53:27

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 ? Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

15

julow, le 28 mai 2008 à 13:23:06

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??

Répondre à julow

16

Char Snipeur, le 28 mai 2008 à 14:18:34

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

17

Jean, le 28 mai 2008 à 14:53:00

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.

Répondre à Jean

18

julow, le 28 mai 2008 à 15:59:34

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??

Répondre à julow

19

Jean, le 28 mai 2008 à 16:03:42

Bonjour julow je me demandai si une fois que ton code sera fini si tu pouvai me le passer pourr mon projet ?
Merci à toi!!

Répondre à Jean

20

julow, le 28 mai 2008 à 16:24:11

Pas de problème... Mais faut déjà que je le termine parce que je patoge en C++!
Une solution Char Snippeur?

Répondre à julow

28

Jean, le 29 mai 2008 à 17:06:21

Merci beacoup à toi !!

Répondre à Jean

21

Char Snipeur, le 28 mai 2008 à 17:11:50

Tu compile en quoi ?
fait une recherche sur le disque dur de string.h, il doit être dans include.
Jean, j'ai rien compris ! Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

22

julow, le 29 mai 2008 à 08:36: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;
}

Répondre à julow

29

Jean, le 29 mai 2008 à 17:09:37

"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

Répondre à Jean

23

Char Snipeur, le 29 mai 2008 à 10:49:55

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 ! Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

24

julow, le 29 mai 2008 à 13:34:41

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);
}

Répondre à julow

25

Char Snipeur, le 29 mai 2008 à 15:04:37

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

26

julow, le 29 mai 2008 à 15:09:00

Je vais tenter avec Dev C++...

Je te redis ça!

Répondre à julow

27

Char Snipeur, le 29 mai 2008 à 15:18:13

Ha ! Bah voila qui est mieux.
N'oublie pas de lier avec libws2_32.a lors de la compilation pour pouvoir utiliser les sockets. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

37

 Stephen, le 9 sep 2008 à 11:29:04

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...

Répondre à Stephen

30

julow, le 30 mai 2008 à 11:54:36

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!

Répondre à julow

31

Char Snipeur, le 30 mai 2008 à 12:28:09

Dit nous déjà comment tu as fait pour les réseau et les adresses MAC. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

33

julow, le 3 jun 2008 à 09:35:05

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!

Répondre à julow

34

valmont, le 9 sep 2008 à 06:07:34

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 ^^

Répondre à valmont

36

Marco, le 9 sep 2008 à 11:27:13

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...

Répondre à Marco

35

valmont, le 9 sep 2008 à 06:12:12

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

Répondre à valmont