È gethostbyname garantito per tornare strutture hostent con indirizzi IPv4?
-
03-10-2019 - |
Domanda
Non è possibile utilizzare per risolvere i nomi degli host getaddrinfo(...)
e quindi deve attenersi a gethostbyname(...)
è la funzione gethostbyname(...)
garantito per tornare strutture hostent che contengono solo gli indirizzi IPv4 (AF_INET) in caso di successo, in modo che il codice seguente sarebbe sempre portare ad un indirizzo IPv4:
int resolve(const char *name, struct in_addr *addr) {
struct hostent *he = gethostbyname(name);
if (!he)
return 1;
memcpy(addr,he->h_addr_list[0],4);
return 0;
}
Soluzione
No, gethostbyname()
può tornare IPV4 (dot standard) o IPv6 (due punti di serie, o forse dot) la notazione, almeno su Linux . Avrai bisogno di fare con questo. Penso varie implementazioni di esso restituiscono solo IPV4 (ad esempio PHP ), ma ogni piattaforma C che ho usato può e vuole tornare entrambi.
Se la vostra applicazione è solo IPv4, non è troppo difficile da capire che si tratta di IPv6 e errore se l'utente non dispone di un'interfaccia adatta per la connessione all'host remoto. Anche se la vostra applicazione supporta sia, che cosa fa il utente Supporto gateway?
Più di tre .
o la presenza di :
.. il suo IPV6.
Modifica
h_addr
è sinonimo di h_addrlist_[0]
, mentre h_length
è la lunghezza di tutti gli indirizzi.
Forse non sto adeguatamente capire la tua domanda?
Altri suggerimenti
h_addrtype ti dice se h_addr_list contiene IPv4 o IPv6 o altri tipi di indirizzi. È possibile utilizzare un interruttore per cambiare la linea: memcpy (addr, lui-> h_addr_list [0], 4); a memcpy (addr, he-> h_addr_list [0], N); dove N è la lunghezza richiesta per il tipo di indirizzo. Per documentazione di MSDN, h_length è la lunghezza del 'ogni' indirizzo.