11.3. Функция gethostbyname
11.3. Функция gethostbyname
Узлы компьютерных сетей мы обычно идентифицируем по их именам, удобным для человеческого восприятия. Но во всех примерах книги специально использовались IP-адреса вместо имен, поэтому мы точно знаем, что входит в структуры адресов сокетов для таких функций, как connect и sendto, и что возвращается функциями accept и recvfrom. Тем не менее большинство приложений имеют дело с именами, а не с адресами. Это особенно актуально при переходе на IPv6, поскольку адреса IPv6 (шестнадцатеричные строки) значительно длиннее адресов IPv4, записанных в точечно-десятичном представлении. (Например, запись типа AAAA и запись типа PTR для ip6.arpa в предыдущем разделе показывают это со всей очевидностью.)
Самая основная функция, выполняющая поиск имени узла, — это функция gethostbyname. При успешном выполнении она возвращает указатель на структуру hostent, содержащую все адреса IPv4 для узла. Однако она может возвращать только адреса IPv4. В разделе 11.6 рассматривается функция, возвращающая адреса IPv4 и IPv6. Стандарт POSIX предупреждает, что функция gethostbyname может быть исключена из будущей его версии.
ПРИМЕЧАНИЕ
Маловероятно, что реализации gethostbyname исчезнут раньше, чем весь Интернет перейдет на протокол IPv6, а произойдет это еще очень не скоро. Однако удаление функции из стандарта POSIX гарантирует, что она не будет использоваться в новых программах. Вместо нее мы рекомендуем использовать getaddrinfo (раздел 11.6).
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);
Возвращает: непустой указатель в случае успешного выполнения, -1 в случае ошибки
Непустой указатель, возвращаемый этой функцией, указывает на следующую структуру hostent:
struct hostent {
char *h_name; /* официальное (каноническое) имя узла */
char **h_alihases; /* указатель на массив указателей на псевдонимы */
int h_addrtype; /* тип адреса узла: AF_INET */
int h_length; /* длина адреса: 4 */
char **h_addr_list; /* указатель на массив указателей с адресами IPv4 или IPv6 */
};
В терминах DNS функция gethostbyname выполняет запрос на запись типа А. Функция возвращает только адреса IPv4.
На рис. 11.2 представлено устройство структуры hostent и содержащаяся в ней информация, в предположении, что искомое имя узла имеет два альтернативных имени и три адреса IPv4. Все имена узла представляют собой строки языка С.
Рис. 11.2. Структура hostent и ее одержимое
Возвращаемое имя h_name называется каноническим именем узла. Например, с показанными в предыдущем разделе записями CNAME каноническое имя узла ftp://ftp.unpbook.com будет иметь вид linux.unpbook.com. Также если мы вызываем функцию gethostbyname с узла aix с неполным именем, например solaris, то в качестве канонического имени возвращается полное доменное имя (FQDN) solaris.unpbook.com..
ПРИМЕЧАНИЕ
Некоторые версии функции gethostbyname допускают, что аргумент hostname может быть записан в виде строки десятичных чисел, разделенных точками. То есть вызов в форме hptr = gethostbyname("206.62.226.33"); будет работать. Этот код был добавлен, поскольку клиент Rlogin принимает только имя узла, вызывая функцию gethostbyname, и не принимает точечно-десятичную запись [127]. Стандарт POSIX допускает это, но не устанавливает такое поведение в качестве обязательного, поэтому переносимое приложение не может использовать указанную особенность.
Функция gethostbyname отличается от других функций сокетов, описанных нами, тем, что она не задает значение переменной errno, когда происходит ошибка. Вместо этого она присваивает глобальной целочисленной переменной h_errno одну из следующих констант, определяемых в заголовке <netdb.h>:
? HOST_NOT_FOUND;
? TRY_AGAIN;
? NO_RECOVERY;
? NO_DATA (идентично NO_ADDRESS).
Ошибка NO_DATA означает, что заданное имя действительно, но у него нет записи типа А. Примером может служить имя узла, имеющего только запись типа MX.
Самые современные распознаватели предоставляют функцию hstrerror, которая в качестве единственного аргумента получает значение h_errno и возвращает указатель типа const char* на описание ошибки. Некоторые примеры строк, возвращаемых этой функцией, мы увидим в следующем примере.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Пример: использование функций gethostbyname и getservbyname
Пример: использование функций gethostbyname и getservbyname Теперь мы можем изменить код нашего TCP-клиента времени и даты, показанный в листинге 1.1, так, чтобы использовать функции gethostbyname и getservbyname и принимать два аргумента командной строки: имя узла и имя службы. Наша программа
27.3.4. Функция gethostbyname()
27.3.4. Функция gethostbyname() Пользователям обычно удобнее указать символьное имя сервера, чем его IP-адрес. Для разрешения имени служит функция gethostbyname(). Вот ее прототип:#include <netinet/in.h>#include <netdb.h>struct hostent *gethostbyname(char *name);Данная функция возвращает указатель на структуру типа
Функция mq_open
Функция mq_open В листинге 5.17 приведен текст первой части функции mq_open, создающей новую очередь сообщений или открывающей существующую.Листинг 5.17. Функция mq_open: первая часть//my_pxmsg._mmap/mq_open. с1 #include "unpipc.h"2 #include "mqueue.h"3 #include <stdarg.h>4 #define MAX_TRIES 105 struct mymq_attr defattr =6 { 0, 128, 1024, 0
6.4. Функция msgrcv
6.4. Функция msgrcv Сообщение может быть считано из очереди с помощью функции msgrcv.#include <sys/msg.h>ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag);/* Возвращает количество данных в сообщении, –1 – в случае ошибки */Аргумент ptr указывает, куда следует помещать принимаемые данные. Как и для
6.5. Функция msgctl
6.5. Функция msgctl Функция msgctl позволяет управлять очередями сообщений:#include <sys/msg.h>int msgctl(int msqid, int cmd, struct msqid_ds *buff);/* Возвращает 0 в случае успешного завершения, –1 в случае ошибки */Команд (аргумент cmd) может быть три:? IPC_RMID — удаление очереди с идентификатором msqidиз системы.
Функция SUM
Функция SUM Ваши возможности в подведении итогов не ограничены простым подсчетом записей. Используя функцию SUM, можно генерировать итоговые результаты для всех возвращаемых записей по любым числовым полям. Например, для создания запроса, который генерирует итоги по
Функция uni()
Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book
Функция uni()
Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book
Хэш-функция.
Хэш-функция. Еще одно важное преимущество использования PGP состоит в том, что PGP применяет так называемую «хэш-функцию», которая действует таким образом, что в том случае какого-либо изменения информации, пусть даже на один бит, результат «хэш-функции» будет совершенно
Функция uni()
Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book
Хэш-функция
Хэш-функция Однако описанная выше схема имеет ряд существенных недостатков. Она крайне медлительна и производит слишком большой объём данных — по меньшей мере вдвое больше объёма исходной информации. Улучшением такой схемы становится введение в процесс преобразования
Стивенс Уильям Ричард
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉