web-dev-qa-db-fra.com

Sockets - Comment savoir quel port et quelle adresse me sont attribué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 IP et quel port me sont réellement attribués?

37
stringo0

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

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 serveur peut accepter des connexions à n'importe quelle adresse IP de la machine et le socket serveur lui-même n'a 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 (que vous obtenez de accept()) afin de savoir quelle adresse IP locale est utilisée sur cette connexion.

69
mark4o

Le commentaire dans votre code est faux. INADDR_ANY ne met pas automatiquement l'IP du serveur '. Il met essentiellement 0.0.0.0 , pour les raisons expliquées dans mark4o réponse .

5
user207421