get adresse IP

get adresse IP - C++ - Programmation

Marsh Posté le 24-07-2002 à 10:46:24    

Bonjour,  
Sous linux, je voudrais écrire une fonction en langage C qui puisse m'afficher l'@IP de la machine sur laquelle tourne mon programme

Reply

Marsh Posté le 24-07-2002 à 10:46:24   

Reply

Marsh Posté le 24-07-2002 à 11:16:09    

Là je suis sous Win mais je pense qu'avec un bind tu dois pouvoir récupérer les infos nécessaires.

Reply

Marsh Posté le 24-07-2002 à 11:32:34    

le bind c'est pour les sockets

Reply

Marsh Posté le 24-07-2002 à 11:35:14    

Ben oui mais je n'ai pas d'autre solution à te proposer....
A moins que l'IP soit copiée dans une variable d'environnement au démarrage (là je délire peut-être un peu) auquel cas un getenv() est plus rapide...

Reply

Marsh Posté le 24-07-2002 à 13:00:58    

ta deux solution que je connais
- soit tu utilise  
 

Code :
  1. struct hostent*hp=gethostbyname(nomHote);
  2.    if(hp==NULL)
  3.    {
  4.      msgBox("Impossible d'obtenire les informations sur l'hôte." );
  5.          return FALSE;
  6.    }
  7.    char *p;
  8.    for (int i=0; hp->h_addr_list[i]!=NULL; i++)
  9.    {
  10.     p =(char *) &(*((unsigned int *) hp->h_addr_list [i])) ;
  11.         memset (ipCarteReseau[i], 0, 16);
  12.         sprintf(ipCarteReseau[i], "%d.%d.%d.%d",
  13.                        (unsigned char)*(p+0),
  14.                (unsigned char)*(p+1),                                  (unsigned char)*(p+2),
  15.                        (unsigned char)*(p+3));
  16.    }


qui te fou les ips dans ipCarteReseau
 
- soit tu crée une socket puis tu utilise la fonction ioctl je crois pour lire les info directement dans le module, il faut que recherche dans les sources de ifconfig

Reply

Marsh Posté le 24-07-2002 à 13:12:27    

Pour la première solution avec gethostbyname, il faut le nom de la machine je crois
Le principe de cette fonction, c'est que tu fourni le nom de l'hôte et gethostbyname te renvoi l'@IP associée à ce nom d'hôte
Il me faudrait la même chose, mais sans être obligé de préciser le nom de la machine :D

Reply

Marsh Posté le 24-07-2002 à 13:25:30    

ben tu prend la deuxième alors :)

Reply

Marsh Posté le 24-07-2002 à 13:32:33    

Non finalement, je prends la première
Je fais d'abord nom_hote=system("hostname" );
et ensuite gethostbyname(nom_hote);
et ça marche ;)
Je sais pas si c'est très bien de faire appel à la commande system dans un programme, mais pour le moment j'ai pas mieux
merci

Reply

Marsh Posté le 24-07-2002 à 14:43:22    

ben je vois po vraiment comment tu peus faire autrement et puis c fait pour ca ...

Reply

Marsh Posté le 24-07-2002 à 14:45:23    

Sous Windows y a aussi une fonction GetHostByName, mais en plus il y a une fonction GetHostName qui renvoie le nom du PC courant. Y a pas ça en Linux ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-07-2002 à 14:45:23   

Reply

Marsh Posté le 24-07-2002 à 15:31:47    

127.0.0.1
 
LeGreg

Reply

Marsh Posté le 24-07-2002 à 15:32:25    

J'ose espérer que ce n'est pas pour faire une connexion locale qu'il avait besoin de ça :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-07-2002 à 15:50:52    

En fait c'est une question plus philosophique qu'il n'y parait
 
l'adresse IP c'est ce qui permet de me contacter depuis l'ordinateur B distant.
 
Si B est sur mon brin, il peut utiliser une adresse de broadcast pour me contacter (pratique s'il ne connait pas mon adresse). Si je suis B, alors un localhost = 127.0.0.1 suffit. Si B est sur mon reseau local, il peut me contacter a l'adresse 196.x.x.x, adresse fixée par mon administrateur reseau.
Si B est sur de l'autre coté de la terre, c'est l'adresse que m'aura fourni mon fournisseur d'acces que je lui donnerai, parfois tous les gens de ma compagnie auront la meme adresse ou il y aura un nombre d'adresses limitées à répartir entre toutes les demandes de connexions.
Si j'ai deux (ou plus) cartes réseau alors je suis rattaché à deux brins, et suivant la position de B, je devrai lui fournir l'une ou l'autre adresse.
 
A+
LeGreg

Reply

Marsh Posté le 24-07-2002 à 15:55:29    

par locale je voulais dire sur lui même (loopback)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-07-2002 à 15:56:12    

une solution tres simple pour avoir son adresse distante
c'est d'interroger une machine sur internet et lui demander de quelle adresse semble provenir la connexion.
 
LeGreg

Reply

Marsh Posté le 24-07-2002 à 22:25:40    

voila la deuxième solution (je suis po sur que ce soit complètement fiable, je vien juste de la faire)
 

Code :
  1. ifreq ifr;
  2. sockaddr_in *saddin;
  3. if(sock=sock(AF_INET, SOCK_DGRAM, 0)<0)
  4.    //erreur
  5. strcpy(ifr.ifr_name, "eth0" );
  6. ifr.ifr_addr.sa_family=AF_INET;
  7. if(ioctl(sock, SIOCGIFADDR, &ifr)<0)
  8.    //erreur
  9. saddin=(sockaddr_in*)&ifr.ifr_addr;
  10. cout<<inet_ntoa(saddin->sin_addr);
  11. close(sock);


 
par cette méthode la tu peus obtenire un nombre impréssionant de renseignement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed