Obtenir l’adresse source d’une connexion de socket entrante

J’ai un serveur avec un socket entrant d’un client. J’ai besoin d’obtenir l’adresse IP du client distant. in_addr essayé de chercher in_addr sur in_addr mais c’est un peu gênant. Aucune suggestion?

Vous avez besoin de la fonction getpeername . Le guide des réseaux de Beej contient une page à ce sujet . Voici un exemple de code à partir de là:

 // assume s is a connected socket socklen_t len; struct sockaddr_storage addr; char ipstr[INET6_ADDRSTRLEN]; int port; len = sizeof addr; getpeername(s, (struct sockaddr*)&addr, &len); // deal with both IPv4 and IPv6: if (addr.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&addr; port = ntohs(s->sin_port); inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; port = ntohs(s->sin6_port); inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr); } printf("Peer IP address: %s\n", ipstr); 

En supposant que vous utilisez accept() pour accepter les connexions socket entrantes, getpeername() n’est pas nécessaire. Les informations d’adresse sont disponibles via les 2ème et 3ème parameters de l’appel accept() .

Voici la réponse d’Eli modifiée pour le faire sans getpeername() :

 int client_socket_fd; socklen_t len; struct sockaddr_storage addr; char ipstr[INET6_ADDRSTRLEN]; int port; len = sizeof addr; client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len); // deal with both IPv4 and IPv6: if (addr.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&addr; port = ntohs(s->sin_port); inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; port = ntohs(s->sin6_port); inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr); } printf("Peer IP address: %s\n", ipstr); 

Puisque vous dites qu’il s’agit d’une connexion entrante d’un client, vous pouvez simplement getpeername l’adresse getpeername l’adresse retournée par l’appel accept() dans les deuxième et troisième parameters.