Читаем Linux API. Исчерпывающее руководство полностью

Преобразование имен узлов и служб в двоичный вид и обратно

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

Функция getnameinfo() выполняет обратное преобразование, превращая IP-адрес и номер порта в соответствующие имена узла и службы.

С помощью функций getaddrinfo() и getnameinfo() можно также переводить IP-адрес в презентационный формат и обратно.

Прежде чем приступать к подробному обсуждению этих функций в разделе 55.10, сначала необходимо рассмотреть службу DNS (см. раздел 55.8) и файл /etc/services (см. раздел 55.9). DNS позволяет совместно работающим серверам обслуживать распределенные базы данных, которые привязывают IP-адреса к именам узлов и наоборот. Существование таких служб, как DNS, необходимо для работы Интернета, поскольку централизованное управление всеми существующими именами узлов было бы попросту невозможным. Файл /etc/services привязывает номера портов к символьным именам служб.

55.6. Функции inet_pton() и inet_ntop()

Функции inet_pton() и inet_ntop() позволяют преобразовывать IPv4- и IPv6-адреса между двоичным и презентационным (десятичные числа, разделенные точками, или шестнадцатеричная строка) форматами. Буква p в именах этих функций обозначает presentation («презентационный»), а n — network («сеть»).

#include

int inet_pton(int domain, const char *src_str, void *addrptr);

Возвращает 1 при успешном завершении, 0, если строка src_str не соответствует презентационному формату, или -1 при ошибке

const char *inet_ntop(int domain, const void *addrptr, char *dst_str,

size_t len);

Возвращает указатель на dst_str или NULL при ошибке

Презентационный вид представляет собой строку, понятную для человека. Например:

• 204.152.189.116 (IPv4-адрес в виде десятичных чисел, разделенных точками);

•::1 (IPv6-адрес в виде шестнадцатеричных значений, разделенных двоеточиями);

•::FFFF:204.152.189.116 (IPv4-адрес, совместимый с IPv6).

Функция inet_pton() переводит презентационную строку, переданную в аргументе src_str, в двоичный IP-адрес с сетевым порядком следования байтов. Аргумент domain должен быть равен AF_INET или AF_INET6. Полученный адрес помещается в структуру, на которую указывает аргумент addrptr; тип структуры должен быть либо in_addr, либо in6_addr, в зависимости от значения domain.

Функция inet_ntop() выполняет обратное преобразование. Повторим: аргумент domain должен быть равен AF_INET или AF_INET6, а указатель addrptr должен ссылаться на структуру типа in_addr или in6_addr, которую мы хотим преобразовать. Итоговая строка с нулевым символом в конце помещается в буфер, на который указывает dst_str. Аргумент len должен содержать размер этого буфера. В случае успеха функция inet_ntop() возвращает dst_str. Если размер len слишком маленький, то inet_ntop() возвращает NULL, а глобальной переменной errno присваивается ENOSPC.

Чтобы подобрать подходящий размер буфера, на который указывает аргумент dst_str, можно использовать две константы, определенные в заголовочном файле . Речь идет о максимальной длине (включая завершающий нулевой байт) презентационной строки для IPv4- и IPv6-адресов:

#define INET_ADDRSTRLEN 16 /* Максимальный размер строки с десятичными числами,

разделенными точками (IPv4) */

#define INET6_ADDRSTRLEN 46 /* Максимальный размер шестнадцатеричной строки (IPv6) */

Примеры использования inet_pton() и inet_ntop() приведены в следующем разделе.

55.7. Пример клиент-серверного приложения (на основе датаграммных сокетов)

В этом разделе мы возьмем клиентскую и серверную программы для изменения регистра, показанные в разделе 53.3, и перепишем их с учетом использования датаграммных сокетов в домене AF_INET6. Исходный код будет представлен с минимальными комментариями, поскольку по своей структуре он похож на ранее рассмотренные программы. Главное отличие новой версии заключается в определении и инициализации структуры с адресом сокета в формате IPv6, которую мы описали в разделе 55.4.

И клиент, и сервер задействуют заголовочный файл, показанный в листинге 55.2. В этом файле определяется номер порта сервера и максимальный размер сообщений, которыми клиент и сервер могут обмениваться между собой.

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных