2011-09-07 11 views
7

Ho uno sockaddr_storage contenente l'indirizzo IPv4 e la porta di un host remoto. Non ho visto prima questi struct s e non sono sicuro di come lanciarlo in un struct dove posso recuperare direttamente l'indirizzo IP e il numero di porta. Ho provato a cercare su google il struct ma non ho trovato nulla. Qualche suggerimento su come fare questo?recupero di IP e porta da un sockaddr_storage

Grazie

+0

Sei sicuro che sia una struttura 'sockaddr_storage' e non una struttura' sockaddr'? –

+0

Sì, è una struttura sockaddr_storage. – KaiserJohaan

+1

@Tony: 'sockaddr_storage' è la struttura preferita da utilizzare nel codice più recente, in quanto supporta più famiglie di indirizzi, inclusi IPv4 e IPv6. –

risposta

5

È possibile lanciare il puntatore struct sockaddr_in * o struct sockaddr_in6 * e accedere ai membri direttamente, ma che sta per aprire un vaso di Pandora su aliasing violazioni e problemi miscompilation.

Un approccio migliore sarebbe passare il puntatore a getnameinfo con i flag NI_NUMERICHOST e NI_NUMERICSERV per ottenere una rappresentazione di stringa dell'indirizzo e della porta. Questo ha il vantaggio di supportare sia IPv4 che IPv6 senza codice aggiuntivo, e in teoria supporta anche tutti i tipi di indirizzo futuri. Potrebbe essere necessario impostare il puntatore su void * (o struct sockaddr * in modo esplicito, se si utilizza C++) per passarlo a getnameinfo, ma ciò non dovrebbe causare problemi.

+0

Sto solo usando le librerie standard C; estrarre la porta da una corda sembra doloroso. Se so in anticipo se sarà Ipv4 o Ipv6, non ci sono problemi con il cast in una struct sockaddr_in/sockaddr_in6? – KaiserJohaan

+0

Non vedo come 'atoi' sia difficile ... –

2

Per estendere una risposta sopra e fornire un codice che utilizza getnameinfo funzione, controllare questo frammento:

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); 

Il risultato è che un hoststr contiene un indirizzo IP da struct sockaddr_storage e portstr contiene una porta rispettivamente.

Problemi correlati