[C] Problème pour obtenir l'@ IP

Problème pour obtenir l'@ IP [C] - C - Programmation

Marsh Posté le 25-03-2004 à 15:34:31    

Je suis sous linux et je voudrais simplement afficher l'adresse IP de ma machine sans donner de paramètres. Le code suivant compile mais me renvoie une erreur de segmentation qui apparemment viendrait d'une incompatibilité avec gethostname. Aidez moi svp.
 
 

Code :
  1. #include <stdio.h>
  2. #include <netdb.h>
  3. #include <arpa/inet.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. int main(){
  7.   struct hostent *hp;
  8.   struct in_addr ad;
  9.   char* nom;
  10.   gethostname(nom, 30);
  11.   printf("%s\n", nom);
  12.   hp = gethostbyname(nom);
  13.   bcopy(hp->h_addr, &ad.s_addr, sizeof(ad.s_addr));
  14.   printf("IP Address = %s\n", inet_ntoa(ad));
  15.   return(0);
  16. }

Reply

Marsh Posté le 25-03-2004 à 15:34:31   

Reply

Marsh Posté le 25-03-2004 à 15:47:33    

c'est limite comme question.
prend un bouquin de C et lis correctement les docs...
pour faire très simple:
 
char nom[30];
gethostname(nom,30);

Reply

Marsh Posté le 25-03-2004 à 15:56:59    

ok merci du conseil
ca marche :D

Reply

Marsh Posté le 25-03-2004 à 15:59:14    

bah oui, c'est logique, quand tu fais "char* nom" tout bêtement, tu déclare juste un pointeur, et tu n'as donc pas l'éspace nécessaire pour y loger les données de ta chaîne... quand tu fais "char nom[30]" là tu demandes de la place pour ranger 30 caractères...

Reply

Marsh Posté le 25-03-2004 à 17:05:50    

SoWhatIn22 a écrit :

c'est limite comme question.
prend un bouquin de C et lis correctement les docs...
pour faire très simple:
 
char nom[30];
gethostname(nom,30);
 

:non: on oublie pas son pote sizeof ok ?
 
 
char nom[30];
gethostname(nom, sizeof nom);

Reply

Marsh Posté le 30-03-2004 à 12:58:57    

Voila un ptit bout de code ki te donnera ton ip local + le nom réseau de ta machine :  
 
 
#include <stdio.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <netdb.h>  
#include <string.h>  
 
 
#define MAXHOSTNAME 32  
/* longueur max de son propre nom de machine */  
#define PORT_DIST 0x6198
 /* numéro de port distant avec lequel on va tenter de  
dialoguer */  
 
/* on va ici mettre les deux extremites de la liaison sur la meme machine */  
struct hostent *infohost();  
void adresSock();  
 
 
main()  
{  
int ip;  
/* descripteur du socket */  
 
struct sockaddr_in sa; /* structure adresse socket */  
int ssa;  
/* taille de la structure sa */  
struct hostent *hp;  
/* resultat de la recherche du nom */  
/* recherche des infos sur la machine qui heberge le programme */  
hp = infohost();  
 
/* lecture des adresses dans la socket */  
adresSock(ip);  
 
/* mise à zero de la structure sa */  
ssa = sizeof(sa);  
memset(&sa, 0, ssa);  
 
/* copie de l'adresse dans la structure sa */  
bcopy((char *)hp->h_addr, (char *)&sa.sin_addr, hp->h_length);  
sa.sin_family = hp->h_addrtype;  
 
/* copie du numero de port dans la structure sa */  
sa.sin_port = htons(PORT_DIST);  
adresSock(ip);  
}  
 
/* infohost : recherche et affichage d'informations sur la machine hote */  
struct hostent *infohost() {  
char host[MAXHOSTNAME+1]; /* tableau pour accueillir le nom de machine sur lequel  
tourne ce programme +1 à cause du fin de caractère . */  
 
struct hostent *hp;  
/* resultat de la recherche du nom */  
char *adrIPp;  
struct in_addr adrIP;  
gethostname(host, MAXHOSTNAME);  
printf("nom de la machine sur lequel tourne ce programme : %s\n", host);  
if((hp=gethostbyname(host))==NULL)  
{  
fprintf(stderr, "machine non identifiee par gethostbyname\n" );  
exit(1);  
}  
adrIP.s_addr=*(int *)hp->h_addr;  
adrIPp =(char *)inet_ntoa(adrIP);  
printf("adresse IP de cette machine : %s\n", adrIPp);  
return(hp);  
}  
 
/* adresSock : lecture des adresses dans la socket */  
void adresSock(int ip)
{  
struct sockaddr_in sa;  
/* structure adresse socket */
}  
 
====================================
nom de la machine sur lequel tourne ce programme : ***
adresse IP de cette machine : 10.****.****.****
====================================

Reply

Marsh Posté le 30-03-2004 à 13:07:10    

int main()  
 
pas de bcopy -> memcpy/memmove
 
ta variable ssa ne sert à rien
 

Reply

Sujets relatifs:

Leave a Replay

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