2011-09-07 16 views
7

Tengo un sockaddr_storage que contiene la dirección IPv4 y el puerto de un host remoto. Aunque no he visto estos struct antes y no estoy seguro de cómo convertirlo en un struct donde puedo recuperar directamente la dirección IP y el número de puerto. Intenté buscar en Google el struct pero no encontré nada. ¿Alguna sugerencia sobre cómo hacer esto?recuperación de la ip y el puerto de un sockaddr_storage

Gracias

+0

¿Estás seguro de que es una estructura 'sockaddr_storage' y no una estructura' sockaddr'? –

+0

Sí, es una estructura sockaddr_storage. – KaiserJohaan

+1

@Tony: 'sockaddr_storage' es la estructura preferida para usar en el código más nuevo, ya que admite múltiples familias de direcciones, incluyendo IPv4 e IPv6. –

Respuesta

5

Puede emitir el puntero a struct sockaddr_in * o struct sockaddr_in6 * y acceder a los miembros directamente, sino que va a abrir una lata de gusanos sobre aliasing violaciónes y cuestiones miscompilation.

Un mejor enfoque sería pasar el puntero a getnameinfo con los indicadores NI_NUMERICHOST y NI_NUMERICSERV para obtener una representación de cadena de la dirección y el puerto. Esto tiene la ventaja de que admite tanto IPv4 como IPv6 sin código adicional y, en teoría, admite todos los tipos de direcciones futuras. Es posible que deba convertir el puntero a void * (o struct sockaddr * explícitamente, si usa C++) para pasarlo a getnameinfo, pero esto no debería causar problemas.

+0

Solo estoy usando bibliotecas estándar C; extraer el puerto de una cadena suena doloroso. Si sé de antemano si será Ipv4 o Ipv6, ¿no hay problemas para convertirlo en una estructura sockaddr_in/sockaddr_in6? – KaiserJohaan

+0

No veo cómo 'atoi' es difícil ... –

2

Para extender una respuesta anterior y proporcionar un código que utiliza getnameinfo función, visita este fragmento:

struct sockaddr_storage client_addr; 
socklen_t client_len = sizeof(struct sockaddr_storage); 

// Accept client request 
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len); 

char hoststr[NI_MAXHOST]; 
char portstr[NI_MAXSERV]; 

int rc = getnameinfo((struct sockaddr *)&client_addr, client_len, hoststr, sizeof(hoststr), portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV); 
if (rc == 0) printf("New connection from %s %s", hoststr, portstr); 

El resultado es que un hoststr contiene una dirección IP de struct sockaddr_storage y una portstr contiene un puerto respectivamente.

Cuestiones relacionadas