Comment déterminer l’IP utilisée par le client se connectant au socket d’écoute INADDR_ANY en C

J’ai une application de serveur de réseau écrite en C, l’écouteur est lié à l’aide de INADDR_ANY afin qu’il puisse accepter les connexions via n’importe quelle adresse IP de l’hôte sur lequel il est installé.

Je dois déterminer laquelle des adresses IP du serveur le client a utilisé lors de l’établissement de sa connexion. En fait, j’ai simplement besoin de savoir s’il s’est connecté via l’adresse de bouclage 127.0.0.1 ou non.

Exemple de code partiel comme suit (je peux poster le tout si cela peut vous aider):

static struct sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = INADDR_ANY; serverAddress.sin_port = htons(port); bind(listener, (struct sockaddr *) &serverAddress, sizeof(serverAddress)); listen(listener, CONNECTION_BACKLOG); SOCKET socketfd; static struct sockaddr_in clientAddress; ... socketfd = accept(listener, (struct sockaddr *) &clientAddress, &length); 

La solution à mon problème spécifique (grâce à zildjohn01) au cas où quelqu’un en aurait besoin, est présentée ci-dessous:

 int isLocalConnection(int socket){ struct sockaddr_in sa; int sa_len = sizeof(sa); if (getsockname(socket, &sa, &sa_len) == -1) { return 0; } // Local access means any IP in the 127.xxx range return (sa.sin_addr.s_addr & 0xff) == 127; } 

Vous pouvez utiliser la fonction getsockname .

La fonction getsockname () récupère le nom lié localement à la socket spécifiée

À partir de votre code

 socketfd = accept(listener, (struct sockaddr *) &clientAddress, &length); 

Analysez le clientAddress retourné. C’est ce dont vous avez besoin.