[c] afficher un élément d'une structure complexe de type hostent

afficher un élément d'une structure complexe de type hostent [c] - C - Programmation

Marsh Posté le 03-11-2003 à 23:24:13    

bon voila j'ai ma structure si dessous :
 
struct  hostent {
     char *  h_name;      
     char ** h_aliases;  
     int     h_addrtype;  
     int     h_length;    
     char ** h_addr_list;
};
 
avec une variable "adresse" de type hostent.
je voudrais afficher h_name et je fais donc :
printf("%s", adresse.h_name);
 
mais là le compilo m'envoie bouler et renseignement pris auprès du prof il ne sait pas d'ou ça vient...  :ange:  :heink:  
 
comment faire pour afficher ce h_name ? (car euh il trouve pas l'adresse du serveur donc bah obliger de remonter et de faire des printf partout...).

Reply

Marsh Posté le 03-11-2003 à 23:24:13   

Reply

Marsh Posté le 03-11-2003 à 23:30:19    

LordAnkou a écrit :


mais là le compilo m'envoie bouler

On peut avoir le message complet et la ligne stp ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2003 à 00:17:22    

LordAnkou a écrit :

bon voila j'ai ma structure si dessous :
 
struct  hostent {
     char *  h_name;      
     char ** h_aliases;  
     int     h_addrtype;  
     int     h_length;    
     char ** h_addr_list;
};
 
avec une variable "adresse" de type hostent.
je voudrais afficher h_name et je fais donc :
printf("%s", adresse.h_name);
 
mais là le compilo m'envoie bouler et renseignement pris auprès du prof il ne sait pas d'ou ça vient...  :ange:  :heink:  
 
comment faire pour afficher ce h_name ? (car euh il trouve pas l'adresse du serveur donc bah obliger de remonter et de faire des printf partout...).

Juste a titre indicatif, prof ou??
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-11-2003 à 00:36:59    

c'est pas hors-charte le trollage sur l'école supérieure privée d'informatique du sud de Paris ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2003 à 03:53:26    

Citation :

(car euh il trouve pas l'adresse du serveur donc bah obliger de remonter et de faire des printf partout...)


 
Sinon pour debugger il y a aussi les debugger. Sauf cas bien particuliers c'est quand même mieux que les printf.
 
Sinon donne le morceau de code ou tu définis adresse, et celui où tu cherches a l'afficher.

Reply

Marsh Posté le 04-11-2003 à 07:04:55    

Citation :

On peut avoir le message complet et la ligne stp ?


 
j'ai pas la ligne précise mais il me dit que c pas une structure ou une union (j'essaierai de marquer la ligne précise dans la journée).
 

Citation :

Juste a titre indicatif, prof ou??


iut info à bayonne
 

Citation :

c'est pas hors-charte le trollage sur l'école supérieure privée d'informatique du sud de Paris ?


c quoi le trollage ?
 

Citation :

Sinon donne le morceau de code ou tu définis adresse, et celui où tu cherches a l'afficher.


 
  struct hostent *adresse_a;
 
  bzero(&serveur_a, sizeof(serveur)); /* remise a zero de la variable serveur */
  adresse_a = gethostbyname(nom_serveur_a); /* on recupere l'adresse internet */
  printf("%s", adresse_a.h_name);

Reply

Marsh Posté le 04-11-2003 à 08:46:05    

c'est pas plutôt:

Code :
  1. adresse_a->h_name


par hasard :??:
 
edit: fôte inside


Message édité par Moktar1er le 04-11-2003 à 08:46:31
Reply

Marsh Posté le 04-11-2003 à 09:06:16    

[+1] à moktar


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2003 à 18:46:57    

et hop on continue mais bon je vais un peu exposer mon problème :
j'ai donc un serveur qui se nomme Iparla sur lequel je veux me connecter :
 

Code :
  1. bzero(&serveur, sizeof(serveur));  remise a zero de la variable serveur */
  2.   adresse = gethostbyname(nom_serveur); /* on recupere l'adresse internet */
  3.   printf("nom du serveur : %s\n",adresse->h_name);
  4.   printf("type d'adresse : %d\n",adresse->h_addrtype);
  5.   printf("longueur de l'adresse : %d\n",adresse->h_length);


 
bon alors là il me sort bien le nom du serveur iparla.iutbayonne.univ-pau.fr
le type d'adresse : 2 (ça doit être IF_NET normalement)
la longueur de l'adresse : 4 (là je trouve ça bizarre mais bon...)
 
alors le problème que j'ai c'est :  
je voudrais afficher l'adresse Internet contenu dans la variable adresse (qui est de type hostent) mais ça je sais pas faire.
 
 
parce qu'au final il a le nom du serveur mais il me trouve pas l'adresse internet (quand je la réaffecte dans une autre variable) et n'arrive pas à se connecter (mais il crée bien la socket).

Reply

Marsh Posté le 05-11-2003 à 03:38:43    

h_addr_list est un tableau d'adresses. Chaque adresse est un tableau de h_length char. En IPv4 une adresse fait 32 octets, soit 4 char sur ton archi. D'où h_length = 4. Le truc pour l'affichage c'est qu'il ne faut pas afficher les char en tant que char (%c), mais plutôt en tant que %hhu. Tu peux faire (c'est sale, c'est pour l'exemple) :
 

Code :
  1. #include <stdio.h>
  2. #include <netdb.h>
  3. int
  4. main(int argc, char *argv[], char *envp)
  5. {
  6.         struct hostent *h;
  7.         h = gethostbyname("www.google.com" );
  8.         printf("name   = %s\n"
  9.                "type   = 0x%x\n"
  10.                "length = %d\n"
  11.                "addr   = %hhu.%hhu.%hhu.%hhu\n",
  12.                h->h_name,
  13.                h->h_addrtype,
  14.                h->h_length,
  15.                h->h_addr_list[0][0],
  16.                h->h_addr_list[0][1],
  17.                h->h_addr_list[0][2],
  18.                h->h_addr_list[0][3]);
  19. }


 
Sinon, t'ai-je déja suggéré d'utiliser un debugger ? Et d'apprendre ce qu'est un pointeur aussi, parce que le coup du « . » et du « -> » c'est quand même la base.

Reply

Marsh Posté le 05-11-2003 à 03:38:43   

Reply

Marsh Posté le 06-11-2003 à 09:20:50    

merci pour tout !
j'ai trouvé ou se trouve l'erreur !
 
je vous explique :

Code :
  1. printf("nom du serveur pour la fonction : %s\n", nom_serveur);
  2.  
  3.   bzero(&serveur, sizeof(serveur));  /* remise a zero de la variable serveur */
  4.   bzero(&adresse, sizeof(adresse));
  5.   adresse = gethostbyname(nom_serveur); /* on recupere l'adresse internet */
  6.   printf("nom du serveur : %s\n",adresse->h_name);
  7.   printf("type d'adresse : %x\n",adresse->h_addrtype);
  8.   printf("longueur de l'adresse : %d\n", adresse->h_length);
  9.   printf("adresse1 : %hhu\n",adresse->h_addr_list[0][0]);
  10.   printf("adresse2 : %hhu\n",adresse->h_addr_list[0][1]);
  11.   printf("adresse3 : %hhu\n",adresse->h_addr_list[0][2]);
  12.   printf("adresse4 : %hhu\n",adresse->h_addr_list[0][3]);
  13.  
  14.  
  15.   /* test si la fonction a trouver une adresse correspondant au serveur */
  16.   if (adresse==NULL)
  17.     {
  18.       /* gestion des erreurs */
  19.       /* ----> prevoir la gestion des erreurs avec h_errno */
  20.       printf("erreur numero : %d\n", h_errno);
  21.       exit(-1); /* fin non normal du programme */
  22.     }


 
me retourne :
 
nom du serveur pour la fonction : iparla
nom du serveur : iparla.iutbayonne.univ-pau.fr
type d'adresse : 2
longueur de l'adresse : 4
adresse1 : 65472
adresse2 : 65448
adresse3 : 65500
adresse4 : 15
 
 
ors si il ne trouvait pas l'adresse IP il devrait rentrer dans mon if !

Citation :

Les fonctions gethostbyname() et gethostbyaddr() renvoient
       un pointeur sur la structure hostent, ou bien un  pointeur
       NULL si une erreur se produit, auquel cas h_errno contient
       le code d'erreur.


par conséquent il trouve l'adresse IP d'iparla mais ce n'est pas la bonne qu'il affiche !
 
 

Reply

Marsh Posté le 06-11-2003 à 09:33:09    

moktar1er a écrit :

c'est pas plutôt:

Code :
  1. adresse_a->h_name


par hasard :??:
 
edit: fôte inside


 
un prof qui trouve pas ca c'est quand meme
 
1/Une sacree b(o)use
2/Qqun qui doit super bien connaitre son compilo pour pas comprendre les msg d'erreurs...


Message édité par chrisbk le 06-11-2003 à 09:33:26
Reply

Marsh Posté le 06-11-2003 à 14:08:17    

Citation :

iut info à bayonne


J'y suis passé !

Citation :

un prof qui trouve pas ca c'est quand meme
 
1/Une sacree b(o)use
2/Qqun qui doit super bien connaitre son compilo pour pas comprendre les msg d'erreurs...


 
Ca depend des profs... mais y'en a en effet qui sont plus doués pour les apéros que pour coder...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

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