Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2586 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Afficher correctement le champs h_addr_list de HOSTENT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Afficher correctement le champs h_addr_list de HOSTENT

n°1608540
cimourdain
Posté le 05-09-2007 à 15:05:40  profilanswer
 

Salut,
 
Quand on programme du "réseau" on peut utiliser la fonction gethostbyname() qui consigne des info sur le serveur sur lequel on veut se connecter dans la structure suivante:
 

Code :
  1. typedef struct hostent {
  2.   char FAR* h_name;
  3.   char FAR  FAR** h_aliases;
  4.   short h_addrtype;
  5.   short h_length;
  6.   char FAR  FAR** h_addr_list;
  7. } HOSTENT,
  8. *PHOSTENT,
  9. FAR *LPHOSTENT;


 
Toutes les IP sont dans le champ h_addr_list, il y a plusieurs IP d'où le **.
En général on se préoccupe que de la première c'est a dire h_addr_list[0] et c'est elle qui m'intéresse, je voudrais l'afficher et je sais pas comment faire.
 
En faisant:
 

Code :
  1. printf("IP serveur: %d.%d.%d.%d\n", stru->h_addr_list[0][0], stru->h_addr_list[0][1],\
  2. stru->h_addr_list[0][2], stru->h_addr_list[0][3]);


 
ca foire quand un nombre de l'IP est trop grand (plus grand que 128 je crois) ca affiche à la place un résultat completement abérant, négatif parfois suivant le formatage utilisé dans printf().
Il me semble que cela vient d'une histoire de signé/non signé. Dans ce cas où ca foire, et dans ce ca seulement,
on trouve la bonne valeur en ajoutant 256:
stru->h_addr_list[0][i]+256
 
il faudrait donc pour chacun des 4 nombre de l'adresse faire le test:
stru->h_addr_list[0][0] < 0 ? ajouter 256 : ne rien changer
 
Vu comme c'est compliqué pour ce que c'est je me suis dit qu'il devait bien y avoir un autre moyen beaucoup plus simple !
 
J'ai un peu cherché sur le net, j'ai vu quelqu'un dire qu'il fallait formater comme ceci: %hhu.%hhu.%hhu.%hhu
mais ca ne marche pas.
 
Voilà si vous avez une idée ! Moi je l'avais deja fait sous UNIX et j'avais pas eu ce problème.
 
Question subsidiaire: c'est quoi FAR ? un type ? si oui, lequel ?

Message cité 1 fois
Message édité par cimourdain le 05-09-2007 à 15:10:57
mood
Publicité
Posté le 05-09-2007 à 15:05:40  profilanswer
 

n°1608566
tpierron
Posté le 05-09-2007 à 15:26:46  profilanswer
 

Ouah, tu te prends la tête pour pas grand chose.
 

Code :
  1. struct in_addr addr;
  2. memcpy(&addr.s_addr, stru->h_addr, str->h_length);
  3. printf("IP serveur: %s\n", inet_ntoa(addr));


 
Disclaimeur : j'ai fait ça de mémoire ...
 
Ah sinon, le FAR date de la préhistoire de l'info durant la transition 16/32bits. FAR indiquait qu'on avait un pointeur 32bits. NEAR c'était pour du 16bits. Programmerais-tu sous DOS avec TurboC 1.0 ?

n°1608574
Taz
bisounours-codeur
Posté le 05-09-2007 à 15:46:01  profilanswer
 

Très bof: lis ça http://people.redhat.com/drepper/userapi-ipv6.html et utilise les bonnes fonctions modernes toussa.
 
Excellent papier par le mainteneur de la GNU libc

n°1608583
cimourdain
Posté le 05-09-2007 à 15:56:15  profilanswer
 

ok je te remercie tpierron je vais essyer ca.
 
Non je programme sous Windows XP avec gcc. Pourquoi ? c'est pas bien d'utiliser ca ? En fait j'ai trouvé la doc des fonction réseau qui me sere dans msdn mais j'ai remarqué que la plupart des fonction et des types avaient été refait par Microsoft, ils sont préfixés par WSA exemple: connect() et WSAConnect(), send() et WSASend() etc...
 
Moi j'ai toujours utilisé les fonction non WSA, c'est pas une bonne idée ? celles de Microsoft sont-elles meilleurs ?


Message édité par cimourdain le 05-09-2007 à 15:57:17
n°1608605
cimourdain
Posté le 05-09-2007 à 16:16:43  profilanswer
 

faut linker avec quelle lib pour les fonction modernes comme getaddrinfo() ? parce que avec ws2_32 ca marche plus !


Message édité par cimourdain le 05-09-2007 à 16:18:13
n°1608614
tpierron
Posté le 05-09-2007 à 16:24:13  profilanswer
 

Bah d'après les MSDN c'est la lib libws2_32.a qui est dans le répertoire "lib" d'installation de dev-cpp.
 
J'ai bien cette lib sur mon système avec l'include qui correspond (Ws2tcpip.h).

n°1608621
cimourdain
Posté le 05-09-2007 à 16:44:45  profilanswer
 

ouais moi aussi pourtant le linker me dit qu'il ne trouve pas de référence a cette fonction.


Message édité par cimourdain le 05-09-2007 à 16:44:58
n°1833158
deyv
Posté le 02-01-2009 à 11:57:44  profilanswer
 

cimourdain a écrit :

Code :
  1. printf("IP serveur: %d.%d.%d.%d\n", stru->h_addr_list[0][0], stru->h_addr_list[0][1],\
  2. stru->h_addr_list[0][2], stru->h_addr_list[0][3]);


Il faut l'écrire plutot comme ça :

Code :
  1. printf("IP serveur: %d.%d.%d.%d\n",
  2.         (unsigned char)stru->h_addr_list[0][0],
  3.         (unsigned char)stru->h_addr_list[0][1],
  4.         (unsigned char)stru->h_addr_list[0][2],
  5.         (unsigned char)stru->h_addr_list[0][3]);

(je sais que ça date, mais comme ça reste, ça peut servir)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Afficher correctement le champs h_addr_list de HOSTENT

 

Sujets relatifs
requete SQL sur champs listés via Tabledef FieldsAfficher du code en couleur dans une page HTML
afficher un pdf dans une page html/phpafficher la durée total après chaque fin de date
[MySQL] UPDATE d'un champs à partir d'une autre tablePasser souris sur photo pour afficher une image dans un cadre
afficher/caché du texte...[resolved]Afficher sur une page web directement le resultat d'une autre page web
executer une page php sans rien afficherProblème avec nom de champs identique
Plus de sujets relatifs à : Afficher correctement le champs h_addr_list de HOSTENT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR