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