2010-09-09 8 views
0

J'écris mon premier programme de socket sous Linux et j'essaie d'imprimer l'adresse IP et le port du pair auquel je me suis connecté. J'utilise getpeername() avec inet_ntop() et ntohs() pour extraire les données de la structure sockaddr_in. Quand je regarde les résultats, j'obtiens une adresse IP qui ne va à aucun serveur que je sache (ping échoue) et dit que j'écoute un port que netstat dit n'est pas utilisé.getpeername() renvoie des données incorrectes

Qu'est-ce que je fais mal? Je devrais obtenir 130.215.28.181:39000, mais à la place je reçois 209.94.72.137:18825 chaque fois que j'exécute le programme. En regardant netstat montre que je suis en effet à l'écoute sur le port 39000.

Voici un extrait de mon programme client:

connect(sockfd,&serv_addr,sizeof(serv_addr)) 

// print welcome message 
char ipstr[INET6_ADDRSTRLEN]; 
bzero(ipstr, 50); 
struct sockaddr_in *address; 
socklen_t address_len = sizeof(*address); 
getpeername(sockfd, (struct sockaddr *) address, &address_len); 
inet_ntop(AF_INET, &address->sin_addr, ipstr, sizeof(ipstr)); 
printf("Connection established successfully with %s:%i!\n", ipstr, ntohs(address->sin_port)); 

Répondre

5

Vous n'êtes pas allouer de la mémoire pour la structure sockaddr_in, vous vient de passer un pointeur à un emplacement de mémoire aléatoire. Au lieu de cela, affecter la structure d'adresse sur la pile:

struct sockaddr_in addr; 
socklen_t addr_len = sizeof(addr); 
int err = getpeername(sockfd, (struct sockaddr *) &addr, &addr_len); 
if (err != 0) { 
    // error 
} 

Vous devriez aussi vérifier la valeur de retour de chaque fonction qui est documenté pour retourner un code d'erreur. En particulier, connect et getpeername renvoient des codes d'erreur que vous devriez vérifier.

+0

C'est à ce moment-là que je me souviens pourquoi j'ai une forte aversion pour C. –

+1

@Chris Lieb: discipline mon ami, discipline ... –

+0

Cela pourrait être mauvais si l'adresse struct est en fait un 'sockaddr_in6' – 735Tesla

Questions connexes