Читаем Разработка приложений в среде Linux. Второе издание полностью

Длинные последовательности чисел являются отлично подходящим методом идентификации для компьютеров, позволяющим им однозначно узнавать друг друга. Однако большинство людей охватывает ужас при мысли о том, что придется иметь дело с большим количеством цифр. Для того чтобы разрешить людям применять текстовые названия для компьютеров вместо числовых, в состав протоколов TCP/IP входит распределенная база данных для взаимных преобразований имен хостов и IP-адресов. Эта база данных называется DNS (Domain Name System — служба имен доменов), она подробно рассматривается в [34] и [1].

Служба DNS предлагает много функций, но сейчас нас интересует одна — возможность преобразования IP-адресов в имена хостов и наоборот. Несмотря на то что это преобразование должно выполняться как однозначное соответствие, на самом деле оно представляет собой отношение типа "многие ко многим". Другими словами, каждый IP-адрес может соответствовать нулю или более именам хостов, а каждое имя хоста соответствует нулю или более IP-адресам.

Использование неоднозначного соответствия между именами хостов и IP-адресами может показаться странным. Однако многие Internet-сайты применяют одну и ту же машину для ftp-сайта и Web-сайта. При этом адреса www.some.org и ftp.some.org должны ссылаться на одну и ту же машину, а для одной машины не нужны два IP-адреса. Таким образом, два имени хостов сводятся к одному IP-адресу. Каждый IP-адрес имеет одно первичное, или каноническое имя хоста, которое используется, если IP-адрес требуется преобразовать в единственное имя хоста во время обратного поиска имен.

Наиболее распространенной причиной, по которой одному имени хоста ставится в соответствие несколько IP-адресов, является балансировка нагрузки. Серверы имен (программы, предлагающие преобразование имен хостов в IP-адреса) часто конфигурируются так, что возвращают в разное время разные адреса для одного и того же имени. Это позволяет нескольким физическим машинам поддерживать единую службу.

Появление IPv6 повлекло за собой еще одну причину, по которой одно имя хоста должно иметь несколько адресов. Многие машины сейчас имеют одновременно и IPv4-, и IPv6-адреса.

Библиотечная функция getaddrinfo()[134] предлагает программам простой доступ к преобразованиям имен хостов DNS.

#include

#include

#include

int getaddrinfo(const char * hostname, const char * servicename,

 const struct addrinfo * hints, struct addrinfo ** res);

Концепция этой функции достаточно простая, однако весьма мощная, в связи с этим ее описание может показаться несколько запутанным. Идея заключается в том, что функция принимает имя хоста, имя службы (или оба из них) и превращает их в список IP-адресов. Затем с использованием hints список фильтруется и те адреса, которые не нужны приложению, отбрасываются. Окончательный список возвращается в виде связного списка в переменной res.

Искомое имя хоста содержится в первом параметре и может равняться NULL, если производится поиск только службы. Параметр hostname может быть именем (например, www.ladweb.net) или IP-адресом (с точками или двоеточиями в качестве разделителей), который функция getaddrinfo() преобразует в двоичный адрес.

Второй параметр servicename указывает имя той службы, для которой нужно извлечь официальный порт. Если он равен NULL, то поиск службы не выполняется.

Структура struct addrinfo используется как для hints (при фильтрации полного списка адресов), так и для передачи окончательного списка в приложение.

#include

struct addrinfo {

 int ai_flags;

 int ai_family;

 int ai_socktype;

 int ai_protocol;

 socklen_t ai_addrlen;

 struct sockaddr_t * ai_addr;

 char * ai_canonname;

 struct addrinfo * next;

}

Если struct addrinfo используется для параметра hints, то участвуют только первые четыре члена, остальные должны равняться нулю или NULL. Если задано значение ai_family, то getaddrinfo() возвращает адреса только для указанного семейства протоколов (например, PF_INET). Аналогично, если устанавливается ai_socktype, то возвращаются только адреса данного типа сокета.

Член ai_protocol позволяет ограничивать результаты определенным протоколом. Этот параметр нельзя применять, если не установлен параметр ai_family, а также, если числовое значение протокола (такое как IPPROTO_TCP) не является уникальным среди всех протоколов; он хорошо подходит только для PF_INET и PF_INET6.

Последний член, используемый для hints — это aflags, который принимает одно или несколько (объединенных логическим "ИЛИ") из перечисленных ниже значений.

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT