Гарантируется ли gethostbyname возвращать структуры с адресами IPv4? - PullRequest
1 голос
/ 06 мая 2010

Я не могу использовать getaddrinfo(...) для разрешения имен хостов и поэтому должен придерживаться gethostbyname(...)

Гарантируется ли функция gethostbyname(...), что в случае успеха будут возвращаться структуры с узлами, которые содержат только адреса IPv4 (AF_INET), поэтому следующий код всегда будет приводить к адресу 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;
}

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

h_addrtype сообщает, содержит ли h_addr_list IPv4, IPv6 или другие типы адресов. Вы можете использовать переключатель для изменения строки: memcpy (addr, he-> h_addr_list [0], 4); в memcpy (addr, he-> h_addr_list [0], N); где N - необходимая длина для типа адреса. Согласно документации MSDN, h_length - это длина «каждого» адреса.

2 голосов
/ 06 мая 2010

Нет, gethostbyname() может возвращать нотацию IPV4 (стандартная точка) или IPV6 (стандартное двоеточие или, возможно, точка), по крайней мере в Linux . Вы должны будете иметь дело с этим. Я думаю, что различные реализации этого возвращают только IPV4 (например, PHP ), но каждая платформа C, которую я использовал, может и будет возвращать обе.

Если ваше приложение только для IPV4, его не так уж сложно выяснить, что вы имеете дело с IPV6, и вывести ошибку, если у пользователя нет подходящего интерфейса для подключения к удаленному хосту. Даже если ваше приложение поддерживает оба типа, что поддерживает пользовательский шлюз?

Более трех . или наличие : .. его IPV6.

Редактировать

h_addr является синонимом h_addrlist_[0], а h_length - длина всех адресов.

Возможно, я не совсем понимаю ваш вопрос?

...