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;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top