17.8.2. Преобразование имен хостов

17.8.2. Преобразование имен хостов

Функции getaddrinfo(), getnameinfo(), позволяющие легко создавать программы, которые поддерживают и IPv4, и IPv6, были введены именно с этой целью. Исходные функции имен хостов было сложно расширить на IPv6, их интерфейсы требовали, чтобы приложения учитывали множество особенностей версии в структурах, сохраняющих IP-адрес. Новые интерфейсы абстрактны, поэтому поддерживают IPv4 и IPv6 одинаково.

Вместо того чтобы возвращать связный список, как это делает getaddrinfo(), старые функции имен хостов используют struct hostent, которая может содержать все имена хостов и адреса для одного хоста.

#include <netdb.h>

struct hostent {

 char* h_name;       /* каноническое имя хоста */

 char** h_aliases;   /* псевдонимы (завершающиеся NULL) */

 int h_addrtype;     /* тип адреса хоста */

 int h_length;       /* длина адреса */

 char** h_addr_list; /* список адресов (завершающийся NULL) */

};

Здесь h_name — каноническое имя хоста. Массив h_aliases содержит все псевдонимы данного хоста. Последняя запись в h_aliases — это указатель NULL, сигнализирующий о конце массива.

Параметр h_addrtype сообщает тип адреса хоста. В данной главе будет применяться только AF_INET. Приложения, которые создавались для поддержки IPv6, получат и другие типы адресов[147]. Следующий член h_length указывает длину двоичных адресов для данного хоста. Для адресов AF_INET эта длина равна sizeof(struct in_addr). Последний элемент h_addr_list представляет собой массив указателей на адреса данного хоста, последний из которых равен NULL для обозначения конца списка. Если h_addrtype равен AF_INET, то каждый указатель в этом списке указывает на структуру struct in_addr.

Две библиотечные функции выполняют преобразования между IP-номерами и именами хостов. Первая из них gethostbyname() возвращает struct hostent для имени хоста. Вторая — gethostbyaddr() — возвращает информацию о машине с данным IP-адресом.

#include <netdb.h>

struct hostent * gethostbyname(const char * name);

struct hostent * gethostbyaddr(const char * addr, int len, int type);

Обе функции возвращают указатель на struct hostent. Структура может быть перезаписана при последующем вызове одной из функций, поэтому все значения, которые могут понадобиться позже, программа должна сохранять.

Функция gethostbyname() принимает один параметр — строку, содержащую имя хоста. Функция gethostbyaddr() принимает три параметра, которые вместе определяют адрес. Первый из них addr указывает на struct in_addr. Следующий len устанавливает длину информации, на которую указывает параметр addr. Последний type излагает тип адреса, который нужно преобразовать в имя хоста (AF_INET для IPv4-адресов).

Если во время поиска имени хоста происходят ошибки, то код ошибки передается в h_errno. Вызов функции herror() распечатывает описание ошибки (данная функция почти идентична стандартной функции perror()).

Единственный код ошибки, на котором тестируется большинство программ, это NETDB_INTERNAL, который указывает на неудачный системный вызов. При возвращении этой ошибки параметр errno содержит описание той проблемы, которая привела к отказу.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Видовое преобразование

Из книги Введение в OpenGL автора Компьютеры Автор неизвестен -

Видовое преобразование К видовым преобразованиям будем относить перенос, поворот и изменение масштаба вдоль координатных осей. Для проведения этих операций достаточно умножить на соответствующую матрицу каждую вершину объекта и получить измененные координаты этой


12.5 Просмотр адресов хостов

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

12.5 Просмотр адресов хостов Как мы уже знаем, многие системы предоставляют интерактивные программы-определители, дающие возможность пользователям напрямую обращаться к серверам DNS, посылая к ним запросы и получая ответы. Приведем пример работы с


6.2.5. Преобразование в массив

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

6.2.5. Преобразование в массив Когда диапазон преобразуется в массив, интерпретатор последовательно вызывает метод succ, пока не будет достигнута правая граница, и помещает каждый элемент диапазона в возвращаемый массив:r = 3..12arr = r.to_a # [3,4,5,6,7,8,9,10,11,12]Ясно, что для диапазонов


Преобразование кодировок

Из книги Справочник по PHP автора

Преобразование кодировок convert_cyr_stringПреобразует строку из одной кодировки кириллицы в другую.Синтаксис:string convert_cyr_string(string str, string from, string to);Функция переводит строку str из кодировки from в кодировку to. Конечно, это имеет смысл только для строк, содержащих "русские" буквы, т.к.


Идентичное преобразование

Из книги Технология XSLT автора Валиков Алексей Николаевич

Идентичное преобразование Наличие в XSLT шаблонов, выполняемых по умолчанию, иногда приводит к тому, что процессоры ведут себя не совсем логично с человеческой точки зрения. Например, в простейшем случае может понадобиться переименовать все элементы с именами bold в


28.1. Преобразование идентификатора в имя

Из книги C++. Сборник рецептов автора Диггинс Кристофер

28.1. Преобразование идентификатора в имя В результате выполнения команды ls -l для вывода списка содержимого текущего каталога в третьей и четвертой колонках указываются идентификаторы (ID) пользователя и группы, к которой принадлежит каждый файл. Этот список выглядит


2.4. Предотвращение конфликта имен с помощью пространств имен

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

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


Преобразование в тело

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

Преобразование в тело Команда CONVTOSOLID преобразует в трехмерные тела полилинии и окружности, для которых задана высота. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Solid.В выдавленные трехмерные тела можно преобразовать следующие объекты:• полилинии с


Преобразование в поверхность

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой


Преобразование типов

Из книги автора

Преобразование типов С++ представляет несколько синтаксических конструкций по приведению одного типа к другому. Заключение нужного типа результата в скобки и размещение его перед преобразуемым значением — это традиционный способ, унаследованный от С:const double Pi =