Comment obtenir l’adresse IP locale et le port dans la programmation de socket Unix?

J’ai utilisé ceci comme adresse pour créer un nouveau serveur ( socket() , bind() , listen() ):

 struct sockaddr_in newServer; memset(&newServer, 0, sizeof(newServer)); newServer.sin_family = AF_INET; newServer.sin_addr.s_addr = htonl(INADDR_ANY); newServer.sin_port = htons(UNUSED_PORT); 

La macro UNUSED_PORT est définie sur 0.

Je m’attends à ce qu’un serveur écoute sur n’importe quelle interface et sur un port inutilisé.

J’ai essayé d’utiliser getsockname() pour obtenir mon adresse IP locale et mon port, mais j’ai obtenu des résultats étranges. Le code de sortie comme ci-dessous:

 struct sockaddr_in localAddress; socklen_t addressLength; getsockname(newServerfd, (struct sockaddr*)&localAddress, \ &addressLength); printf("local address: %s\n", inet_ntoa( localAddress.sin_addr)); printf("local port: %d\n", (int) ntohs(localAddress.sin_port)); 

Par exemple, j’ai obtenu 0.255.255.255:0, 0.0.0.0:0, 255.127.0.0:36237, etc. et mon système est Mac OS X 10.7.3.

–mettre à jour–

Après avoir utilisé socklen_t addressLength = sizeof(localAddress); (merci à @cnicutar et @Jonathan Leffler), j’obtiens toujours 0.0.0.0 pour les adresses IP locales; est-ce que tout va bien?

Vous devez initialiser addressLength avant d’appeler getsockname :

 socklen_t addressLength = sizeof(localAddress);