Tengo un servidor con un socket entrante de un cliente. Necesito obtener la dirección IP del cliente remoto. Intentado buscar en google por in_addr
pero es un poco molesto. ¿Alguna sugerencia?Obtener la dirección de origen de una conexión de socket entrante
Respuesta
Necesita la función getpeername
. La gran guía de Beej para redes tiene un page about it. Aquí está un ejemplo de código de allí:
// 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);
+1. Sin embargo, ¿no tenemos que liberar memoria para esto? – iammilind
Noto que 'struct sockaddr_in * s' sombrea el socket' s' en el ámbito externo. Tener una variable sombreada no es ideal. –
hay una manera de obtener el socketDescriptor desde la dirección – Bionix1441
Dado que usted dice que es una conexión entrante de un cliente, como una alternativa a getpeername
sólo puede guardar la dirección que fue devuelto por la llamada accept()
, en el segundo y tercer parámetros.
Suponiendo que está utilizando accept()
para aceptar conexiones de socket entrantes, getpeername()
no es necesario. La información de la dirección está disponible a través de los parámetros 2 y 3 de la llamada accept()
.
Aquí está la respuesta de Eli modificado para hacerlo sin 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);
+1 para usar directamente 'accept() '. Sin embargo, ¿no tenemos que liberar memoria para esto? – iammilind
@iammilind: No creo que se deba liberar ninguna memoria; no veo que se realicen asignaciones dinámicas. Todo se hace con variables asignadas estáticamente. –
- 1. Determinación de la dirección IP y el puerto de una conexión TCP/IP entrante en Erlang
- 2. Enlazar la dirección IPv6 al socket Python como dirección IP de origen
- 3. Cómo determinar una conexión entrante desde la máquina local
- 4. Obtener la dirección IP de un socket remoto Endpoint
- 5. ¿Cómo burlarse de una conexión Socket saliente?
- 6. Suplantar la dirección IP de origen de una solicitud HTTP
- 7. La conexión de socket fue abortado - CommunicationException
- 8. ¿Alguna diferencia entre la conexión de socket y la conexión de tcp?
- 9. Interrumpir un socket de conexión
- 10. Socket C# UDP: Obtener la dirección del receptor
- 11. Configuración de la IP de origen para un socket UDP
- 12. Programación de socket Android sin conexión WIFi
- 13. Cómo obtener la dirección IPv6 de una interfaz en Linux
- 14. Envíe datos adicionales sobre la conexión de socket
- 15. Cómo obtener la dirección IP de sockaddr
- 16. utilizando una conexión de socket sin bloqueo en C
- 17. ¿Hay alguna forma de obtener la dirección IP de origen de un mensaje JMS?
- 18. HTTP conexión persistente vs conexión de socket TCP
- 19. ASP.NET MVC Obtener valores de ruta desde una dirección URL
- 20. Prueba conexión de socket en Python
- 21. ¿Cómo obtengo la dirección IP de la solicitud entrante en Java Play 1.2.4
- 22. Cómo destruir por completo una conexión de socket en C
- 23. cómo crear una conexión de socket en Android?
- 24. socket, detectar la conexión se pierde
- 25. Vuelva a conectar una conexión de socket Java al desconectarse
- 26. ¿Cómo obtener la marca de tiempo del mensaje xmpp entrante?
- 27. obtener la secuencia de un objeto socket en C#
- 28. Rubí - Obtener solicitud cuerpo de la llamada entrante HTTP
- 29. Cómo obtener la dirección IP de boost :: asio :: ip :: tcp :: socket?
- 30. ¿Cómo mantener la conexión de socket VOIP en segundo plano?
in_addr es IPv4 específica, de todos modos – bortzmeyer
man getpeername
–ver la función inet_ntoa (..) en linux .. 'hombre inet_ntoa'. es más fácil que inet_ntop en mi opinión y necesidades, incluyendo arpa/inet.h. aquí hay un ejemplo: http://www.binarytides.com/programming-udp-sockets-c-linux/ – mhk