Pregunta

No se puede utilizar para resolver los nombres de host getaddrinfo(...) y por lo tanto debe atenerse a gethostbyname(...)

Es la función gethostbyname(...) garantizada para volver estructuras hostent que sólo contienen direcciones IPv4 (AF_INET) en caso de éxito, por lo que el siguiente código siempre llevaría a una dirección 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;
}
¿Fue útil?

Solución

No, gethostbyname() puede volver IPV4 (dot estándar) o IPV6 (colon estándar, o tal vez DOT) notación, al menos en Linux . Tendrá que lidiar con eso. Creo que varias implementaciones de devolverlos IPV4 (por ejemplo, PHP ), pero cada la plataforma C que he utilizado puede y va a devolver ambos.

Si su aplicación es sólo IPv4, no es demasiado difícil de entender que se trata de IPV6 y error si el usuario no tiene una interfaz adecuada para conectarse al host remoto. Incluso si su aplicación es compatible con ambos, lo que hace el del usuario de soporte de pasarela?

Más de tres . o la presencia de : .. su IPV6.

Editar

h_addr es un sinónimo de h_addrlist_[0], mientras h_length es la longitud de todas las direcciones.

Tal vez no soy la comprensión adecuada a su pregunta?

Otros consejos

h_addrtype le indica si h_addr_list contiene IPv4 o IPv6 u otros tipos de direcciones. Puede utilizar un interruptor para cambiar la línea: memcpy (dir, he-> h_addr_list [0], 4); a memcpy (addr, he-> h_addr_list [0], N); donde N es la longitud requerida para el tipo de dirección. Por la documentación de MSDN, h_length es la longitud de 'cada uno' de direcciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top