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);