Это GetHostbyName гарантировано вернуть врачу врачей с адресами IPv4?
-
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 - это длина «каждый» адрес.