Afficher correctement le champs h_addr_list de HOSTENT

Afficher correctement le champs h_addr_list de HOSTENT - C - Programmation

Marsh Posté le 05-09-2007 à 15:05:40    

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
Reply

Marsh Posté le 05-09-2007 à 15:05:40   

Reply

Marsh Posté le 05-09-2007 à 15:26:46    

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 ?

Reply

Marsh Posté le 05-09-2007 à 15:46:01    

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

Reply

Marsh Posté le 05-09-2007 à 15:56:15    

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
Reply

Marsh Posté le 05-09-2007 à 16:16:43    

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
Reply

Marsh Posté le 05-09-2007 à 16:24:13    

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

Reply

Marsh Posté le 05-09-2007 à 16:44:45    

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
Reply

Marsh Posté le 02-01-2009 à 11:57:44    

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)

Reply

Sujets relatifs:

Leave a Replay

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