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

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

55.10.4. Функция getnameinfo()

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

#include

#include

int getnameinfo(const struct sockaddr *addr, socklen_t addrlen, char *host,

size_t hostlen, char *service, size_t servlen, int flags);

Возвращает 0 при успешном завершении или ненулевое значение при ошибке

Аргумент addr представляет собой указатель на структуру с адресом сокета, которую нужно преобразовать. Размер ее задается с помощью аргумента addrlen. Обычно значения этих аргументов можно получить из вызовов accept(), recvfrom(), getsockname() или getpeername().

Итоговые имена узла и службы возвращаются в виде строк с нулевым символом в конце, на которые указывают аргументы host и service. Эти строки хранятся в буферах и должны быть выделены вызывающим процессом; их размеры следует передавать с помощью аргументов hostlen и servlen. В заголовочном файле определены две константы, помогающие подобрать размеры данных буферов. Константа NI_MAXHOST обозначает максимальный размер строки с именем узла (в байтах). Она имеет значение 1025. Константа NI_MAXSERV обозначает максимальный размер строки с именем службы (в байтах) и равна 32. Обе константы не входят в стандарт SUSv3, но поддерживаются во всех реализациях UNIX, которые предоставляют функцию getnameinfo() (начиная с версии glibc 2.8, для получения их определений необходимо задать один из следующих макросов проверки возможностей: _BSD_SOURCE, _SVID_SOURCE или _GNU_SOURCE).

Если нам не нужно имя узла, то аргументу host можно присвоить значение NULL, а hostlen передать 0. Аналогично, если нас не интересует имя службы, то аргументам service и servlen можно присвоить значения NULL и соответственно 0. При этом хотя бы один аргумент, host или service, должен иметь ненулевое значение (то же самое касается соответствующего аргумента, обозначающего длину).

Последний аргумент, flags, представляет собой битовую маску, которая влияет на поведение функции getnameinfo(). Маска формируется путем применения побитового ИЛИ к следующим значениям.

• NI_DGRAM — по умолчанию функция getnameinfo() возвращает имя, связанное со службой потокового (TCP) сокета. Обычно это не важно, ведь, как отмечалось в разделе 55.9, для TCP- и UDP-портов почти всегда используются одни и те же имена служб. Однако есть несколько случаев, когда имена все же отличаются; в таких ситуациях флаг NI_DGRAM приводит к возвращению имени службы датаграммного (UDP) сокета.

• NI_NAMEREQD — по умолчанию, если имя узла не удается найти, то вместо него возвращается числовой адрес. Указание флага NI_NAMEREQD повлечет ошибку EAI_NONAME.

• NI_NOFQDN — по умолчанию возвращается полное доменное имя узла. Если указать флаг NI_NOFQDN, то получим только первую часть имени, то есть имя конкретного компьютера (при условии, что он подключен к нашей локальной сети).

• NI_NUMERICHOST — делает так, что строка с адресом возвращается в аргументе host. Это бывает удобно в том случае, если мы хотим избежать запроса к DNS-серверу, который может занять довольно много времени.

• NI_NUMERICSERV — способствует возвращению строки с десятичным представлением номера порта в аргументе service. Это может пригодиться, когда мы знаем, что заданный порт не соответствует имени службы (например, если это динамический порт, присвоенный сокету ядром), и нам не хочется лишний раз выполнять поиск по файлу /etc/services.

При успешном завершении функция getnameinfo() возвращает 0, в случае ошибки — один из ненулевых кодов, описанных в табл. 55.1.

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

Знания, приобретенные в предыдущих разделах, позволяют нам рассмотреть простое клиент-серверное приложение на основе TCP-сокетов. Задача, выполняемая этим приложением, аналогична той, которую решает клиент-серверная программа из раздела 44.8, использующая очередь FIFO: передача клиентам уникальной последовательности чисел (или диапазонов таких последовательностей).

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

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

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

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

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

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

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

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

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