Sockets – Comment savoir quel port et quelle adresse me sont atsortingbués

J’ai du mal à comprendre cela – je travaille avec des sockets en C en utilisant ce guide – http://binarii.com/files/papers/c_sockets.txt

J’essaie d’obtenir automatiquement mon adresse IP et mon port en utilisant:

server.sin_port = 0; /* bind() will choose a random port*/ server.sin_addr.s_addr = INADDR_ANY; /* puts server's IP automatically */ ... ... bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function 

Après une liaison réussie, comment savoir quelle adresse IP et quel port me sont effectivement affectés?

S’il s’agit d’un socket de serveur, vous devez appeler listen() sur votre socket, puis getsockname() pour trouver le numéro de port sur lequel il écoute:

 struct sockaddr_in sin; socklen_t len = sizeof(sin); if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1) perror("getsockname"); else printf("port number %d\n", ntohs(sin.sin_port)); 

En ce qui concerne l’adresse IP, si vous utilisez INADDR_ANY le socket du serveur peut accepter les connexions à n’importe quelle adresse IP de la machine et le socket du serveur lui-même ne possède pas d’adresse IP spécifique. Par exemple, si votre machine a deux adresses IP, vous pouvez obtenir deux connexions entrantes sur ce socket de serveur, chacune avec une adresse IP locale différente. Vous pouvez utiliser getsockname() sur le socket pour une connexion spécifique getsockname() auprès de accept() ) afin de déterminer quelle adresse IP locale est utilisée sur cette connexion.

Le commentaire dans votre code est incorrect. INADDR_ANY ne met pas automatiquement l’adresse IP du serveur ‘. Il met essentiellement 0.0.0.0 , pour les raisons expliquées dans la réponse de mark4o.