pb avec un gethostbyaddr()

 
Poster un nouveau sujet   Répondre au sujet    iprelax.fr Index du Forum -> HTTP
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
pippou
dummy mioche
dummy mioche


Inscrit le: 11 Nov 2004
Messages: 1

MessagePosté le: Jeu Nov 11, 2004 5:43 pm    Sujet du message: pb avec un gethostbyaddr() Répondre en citant

Bonjour tout le monde,
voilà je débute en programation réseau et j'ai un petit pb.
Je dois faire un mini-serveur HTTP.
Voici le debut de mon code :

......................
......................
log = open("log.txt",O_WRONLY);
redirect(STDERR_FILENO,log);

sock = socket(AF_INET,SOCK_STREAM,0);
adresse_locale.sin_family = AF_INET;
adresse_locale.sin_addr.s_addr = INADDR_ANY;
adresse_locale.sin_port = PORT;
bind(sock,(struct sockaddr *)(&adresse_locale),
sizeof(adresse_locale));
my_listen(sock,NOMBRE_CONNEXIONS_EN_ATTENTE);
longueur_adresse_appelant = sizeof(adresse_appelant);

while(1)
{
socket_connexion = accept(sock,
(struct sockaddr *)(&adresse_appelant),
(socklen_t *)&longueur_adresse_appelant);
log_connexion(socket_connexion);

/* CODE DU FILS */
if ( fork() == 0 )
{
...............
...............

Voila mon probleme : quand j'appelle la fonction log_connexion :

void log_connexion(int sd)
{
int size = sizeof(struct sockaddr);
struct sockaddr_in me, you;
struct hostent *h_you, *h_me;
struct in_addr addr;

getsockname(sd,(struct sockaddr *)&me,(socklen_t *)&size);
getpeername(sd,(struct sockaddr *)&you,(socklen_t *)&size);

addr.s_addr = inet_addr(inet_ntoa(you.sin_addr));
h_you = gethostbyaddr((char *)&addr.s_addr,
sizeof(addr.s_addr),
AF_INET);

addr.s_addr = inet_addr(inet_ntoa(me.sin_addr));
h_me = gethostbyaddr((char *)&addr.s_addr,
sizeof(addr.s_addr),
AF_INET);

fprintf(stderr,
"Serveur <%s> (%s:%d) connecte a la
machine distante <%s> (%s:%d)\r\n",
h_me->h_name,
inet_ntoa(me.sin_addr),
ntohs(me.sin_port),
h_you->h_name,
inet_ntoa(you.sin_addr),
ntohs(you.sin_port));
fflush(stderr);
}

J'ai une belle "segmentation fault" parce que les (struct hostent *) h_me et h_you sont NULL (testé avec GDB).
Je ne compend pas pourquoi puisque j'ai testé les valeurs de retour de getsockname(), getpeername() et des 2 inet_ntoa() et qu'elles sont ok.

En plus ce que je comprend encore moins, c'est qu'en fait ça marche quand j'appelle mon serveur en local : si je tape "http://localhost:8080/..." ou "http://127.0.0.1/...." ça marche bien mais dès que je l'appelle avec mon adresse ip sa plante...

Autre chose : tout marche nickel si je n'appelle pas la fonction donc sa vient bien d'elle...

Donc si un oeil expert passait par là, merci de me donner un petit coup de main!!! Je suis dessus depuis deux jours j'en ai marre!!!



Merci. pippou
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    iprelax.fr Index du Forum -> HTTP Toutes les heures sont au format CET (Europe)
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum
Affilzen SARL : Mention légale