2009-11-07 4 views
0

voir le code suivant:quelle adresse IP ne soit accepter le retour

accept(sockfd, (struct sockaddr*)&cliaddr, &slen); 
cout << inet_ntop(AF_INET, cliaddr.sin_addr, ipv4addr, 100); 

mon client se connecte depuis localhost. je reçois une adresse absurde dans la sortie. Ce n'est pas mon adresse IP. Chaque fois que je lance le code, j'obtiens une adresse IP différente. Quand je ping cette adresse IP je ne reçois aucune réponse.

quelle est la raison. Je cours Suse Linux sur une machine virtuelle dans Windows Vista.

Mise à jour:

bzero(&cliaddr, sizeof(cliaddr)); 
int connfd = accept(sockfd, (struct sockaddr*)&cliaddr, &slen); 

if (sem_wait(&mutex) < 0) 
    err_sys("sem_init error"); 

char ipv4addr[100]; 
cout << inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100) << endl; 

//const char* p = inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100); 
//cout << p << endl; 

//cout << (void*)p << " " << (void*)ipv4addr << endl; 

cette adresse de retour comme 0.0.0.0

si je décommenter les lignes, je reçois l'adresse correcte dans toutes les lignes, 127.0.0.1

+0

Je vois un sémaphore dans votre code - assurez-vous que les autres threads n'utilisent pas la même structure d'adresse en même temps. C'est à dire. Cela pourrait être une condition de course. –

+0

Ce code n'initialise pas le paramètre 'slen' à l'appel accepté. Assurez-vous de régler slen à sizeof (cliaddr). – nos

+0

@Nikolai: un seul thread en cours d'exécution –

Répondre

4

Il vous manque le 4ème paramètre dans votre appel à inet_ntop(). Voici un exemple de travail:


    int sockfd, fd; 
    struct sockaddr_in saddr; 
    socklen_t len = sizeof(saddr); 
    char addr_buf[INET_ADDRSTRLEN]; /* defined in <netinet/in.h> */ 

    /* ... socket(), bind(), listen() */ 

    bzero(&saddr, len); 
    if ((fd = accept(sockfd, (struct sockaddr*)&saddr, &len)) == -1) 
    { perror("accept"); exit(1); } /* watch out for EINTR */ 

    if (inet_ntop(AF_INET, &saddr.sin_addr, addr_buf, 
    INET_ADDRSTRLEN) == NULL) 
    { perror("inet_ntop"); exit(1); } 

    printf("accepted connection from [%s:%d]\n", 
    addr_buf, ntohs(saddr.sin_port)); 
    ... 

Toujours vérifier les erreurs lors de la communication avec le réseau.

+0

dans mon programme len n'a pas été initialisé. d'où l'erreur. –

+0

+ "Toujours vérifier les erreurs lors de la communication avec le réseau". –

0

Mon La supposition non fondée est que vous récupérez des adresses IP v6 au lieu de v4, donc votre conversion est désactivée. Vous pouvez essayer d'utiliser netstat pour trouver le port du client (vous obtenez généralement un numéro de port de type aléatoire entre 1025 et 65535) et voir si la valeur hexadécimale apparaît quelque part dans la représentation hexadécimale de cliaddr . S'il existe une corrélation entre le port du client et ce que vous pensez être l'adresse du client, votre conversion est incorrecte.

+0

le client se connecte à l'aide d'une socket appartenant à la famille AF_INET et s'exécute sur localhost. –

+0

aussi inet_ntop devrait renvoyer une erreur dans ce cas. –

+0

Je peux avoir une autre explication. Voir mon autre réponse. –

0

Ma prochaine proposition:

On success, inet_ntop() returns a non-null pointer to dst. NULL is 
     returned if there was an error, with errno set to indicate the error. 

est Cout. < < Assez intelligent pour déréférencer le pointeur renvoyé ou imprimez-vous le pointeur?

+0

pourquoi sinon imprimerait-il 232.76.213.191 –

+0

Je pense qu'il a quelque chose à voir avec la machine virtuelle. –

+0

OK, j'abandonne. Bonne chance! –