Récuperer le nom d'une machine d'apres son IP + new pb concat ! [C ] - C - Programmation
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.
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. |
Oups, WSAStartup ...
Sorry, ca marchera mieux en effet
Merci beaucoup
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
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.
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 ..)
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
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
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 ?
Marsh Posté le 20-08-2004 à 15:37:25
http://msdn.microsoft.com/library/ [...] _kbhit.asp
#include <conio.h>
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.
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