[C ] Récuperer le nom d'une machine d'apres son IP + new pb concat !

Récuperer le nom d'une machine d'apres son IP + new pb concat ! [C ] - C - Programmation

Marsh Posté le 12-08-2004 à 16:49:37    

Voila, cette petite fonction simple permet logiquement d'obtenir le resultat escomtpé :
 

int iptodns ( char * argv )  
{
  struct hostent *sn;
  struct in_addr in;
  in.s_addr = inet_addr(argv);
  //printf("\n>%s",argv);
  sn = gethostbyaddr((char *)&in, 4, AF_INET);
  if ( sn )
    printf("%s\n", sn->h_name);
  else
    printf("\n?\n" );
  return 0;
}

Apres vérification en debug sous Visual Studio, la valeur est correctement enregistrée dans in.s_addr.
Par contre, la fonction gethostbyaddr semble foirer puisqu'elle ne me renvoit jamais le nom d'hote correspondant
De plus l'ip entrée est ok dans la mesure ou un nom lui est associé (directement dans system32/drivers/etc/host !)
 
Any idea ?


Message édité par Sagoth le 17-08-2004 à 14:43:07
Reply

Marsh Posté le 12-08-2004 à 16:49:37   

Reply

Marsh Posté le 12-08-2004 à 17:55:51    

Tu as bien appelé WSAStartup ? Commence par tester avec "127.0.0.1" avant de faire d'autres tests.


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

Marsh Posté le 17-08-2004 à 11:21:09    

HelloWorld a écrit :

Tu as bien appelé WSAStartup ? Commence par tester avec "127.0.0.1" avant de faire d'autres tests.


 
:sweat: Oups, WSAStartup ...
Sorry, ca marchera mieux en effet  :sarcastic:  :p  
Merci beaucoup :)

Reply

Marsh Posté le 17-08-2004 à 14:37:53    

Sinon autre problème, a priori simple mais je ne m'en sors pas.
j'utilise les 2 structures suivantes :

/* STRUCTURES */
typedef struct ip_address{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
}ip_address;
 
typedef struct ip_header{
    u_char  ver_ihl;        // Version (4 bits) + Internet header length (4 bits)
    u_char  tos;            // Type of service  
    u_short tlen;           // Total length  
    u_short identification; // Identification
    u_short flags_fo;       // Flags (3 bits) + Fragment offset (13 bits)
    u_char  ttl;            // Time to live
    u_char  proto;          // Protocol
    u_short crc;            // Header checksum
 ip_address  saddr;      // Source address
    ip_address  daddr;      // Destination address
    u_int   op_pad;         // Option + Padding
}ip_header;

 
Dans une fonction je declare :
> ip_header *ih
 
et j'accède au premier champ de l'ip de la sorte :  
> ih->saddr.byte4,
 
Jusque là ok  :jap:  
 
Maintenant je doisconcatener tous ces champs ip en une chaine de caractère unique.
 
je déclare donc "char * ipadress;" qui servira a recevoir la chaine ip complete, et la fonction strcat.
> strcat(ipadress,ih->saddr.byte4);
 
Lorsque je compile j'ai logiquement l'erreur
 

warning C4047: 'function' : 'const char *' differs in levels of indirection from 'unsigned char '

 
strcat attends en parametre : (char *,const char *)
j'ai : (char *,unsigned char)
 
Le truc c'est que j'ai beau caster le second argument dans tous les sens, (notemment en char *), le programme plante lamentablement lors de l'execution.
 
Saurais tu me dire comment je pourrai caster le second argument ?
 
PS: quand je veux afficher les infos "ih->saddr.byte1" , "ih->saddr.byte2", etc ... j'utilise un %d dans mon printf et non un %c ou %s (sinon plantage), ca me parait étrange aussi.


Message édité par Sagoth le 17-08-2004 à 14:39:45
Reply

Marsh Posté le 17-08-2004 à 14:45:06    

bah vi, strcat travaille avec des chaines de caractères, pas de simples char.
Utilise sprintf pour ça :
 
char szAdress[8];
 
sprintf( szAdress, "%uc.%uc.%uc.%uc",  
ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4);
(.. suis pas sûr pour %uc ..)

Reply

Marsh Posté le 17-08-2004 à 14:47:11    

Mouaih ... c'est faux ce que j'ai écrit ...
faut remplacer les %uc par des %ud

Reply

Marsh Posté le 17-08-2004 à 16:09:51    

ok thx, maintenant je lutte avec la fonction "gethostbyaddr" qui me renvoit un résultat beaucoup trop lentement a mon gout (quand elle ne trouve pas de correspondance de nom pour l'ip donnée).
Mais bon, là c'est pas ma faute :D

Reply

Marsh Posté le 20-08-2004 à 15:30:38    

Bon, sinon puisque j'y suis je vais pas recrer un topic, mais je cherche un moyen de detecter une pression sur une touche du clavier sans "breaker" le programme.
 
Apres une (fastidieuse) recherche pour une solution plus elegante que kbhit(), je me suis rabatue sur cette dernière fonction.
 
Mais impossible de trouver pc.h. J'ai ecummé le net mais pouf, que dalle. Sauriez vous ou je peux me la procurer ?
 
Ou alors sinon s'il existe un moyen plus "propre" que ce kbhit ?


Message édité par Sagoth le 20-08-2004 à 15:32:57
Reply

Marsh Posté le 20-08-2004 à 15:37:25    

http://msdn.microsoft.com/library/ [...] _kbhit.asp
 
#include <conio.h>


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 20-08-2004 à 15:38:46    

merci, decidemment j'ai trop de mal avec msdn, je m'y paume tout le temps.

Reply

Sujets relatifs:

Leave a Replay

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