Гарантируется ли gethostbyname возвращать структуры с адресами IPv4?

Я не могу использовать 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 ответа

Решение

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

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

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

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

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

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

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 - это длина "каждого" адреса.

Другие вопросы по тегам