Это GetHostbyName гарантировано вернуть врачу врачей с адресами IPv4?

StackOverflow https://stackoverflow.com/questions/2783581

  •  03-10-2019
  •  | 
  •  

Вопрос

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

Решение

Нет, gethostbyname() Может вернуть IPv4 (стандартную точку) или IPv6 (стандартная колона или, возможно, точка) обозначения, по крайней мере, на Linux. Отказ Вам нужно будет иметь дело с этим. Я думаю, что различные реализации его возврата только IPv4 (например, Выступ), но каждый 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 - это длина «каждый» адрес.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top