Чтение онлайн

на главную - закладки

Жанры

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

Троан Эрик В.

Шрифт:

Структура

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

#include <netdb.h>

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
, который принимает одно или несколько (объединенных логическим "ИЛИ") из перечисленных ниже значений.

AI_ADDRCONFIG

По умолчанию функция

getaddrinfo
возвращает все адреса, соответствующие запросу. Данный флаг указывает на возврат адресов только тех протоколов, чьи адреса сконфигурированы в локальной системе. Другими словами, она возвращает только IPv4-адреса в системах с IPv4-интерфейсами и только IPv6-адреса в системах с интерфейсами IPv6.

AI_CANONNAME

При возврате поле

ai_canonname
содержит каноническое имя хоста для адреса, указанного в
struct addrinfo
. Поиск этого адреса сопровождается дополнительными поисками в службе DNS и, как правило, не является необходимым.

AI_NUMERICHOST

Параметр

hostname
должен представлять собой адрес в форме с разделительными запятыми или двоеточиями. Никакие преобразования имени хоста не выполняются. Это предохраняет
getaddrinfo
от каких-либо поисков имени хоста, которые могут оказаться весьма длительным процессом.

AI_PASSIVE

Если hostname равен

NULL
и присутствует этот флаг, то возвращается неустановленный адрес, который позволяет ожидать соединений на всех интерфейсах. Если данный флаг не указан (а значение
hostname
равно
NULL
), возвращается адрес обратной связи [135] .

135

Адрес обратной связи — это специальный адрес, который позволяет программам взаимодействовать через TCP/IP с приложениями только на одной и той же машине.

Последний параметр

res
в
getaddrinfo
должен быть адресом указателя на
struct addrinfo
. Для успешного завершения переменная,
на которую указывает
res
, устанавливается на первую запись в односвязном списке адресов, который соответствует запросу. Член
ai_next
структуры
struct addrinfo
указывает на следующий член связного списка, и для последнего узла в списке параметр
ai_next
равен
NULL
.

Когда приложение завершает работу с возвращенным связным списком, функция

freeaddrinfo
освобождает память, занимаемую списком.

#include <sys/types.h>

#include <socket.h>

#include <netdb.h>

void freeaddrinfo(struct addrinfo * res);

Единственным параметром для

freeaddrinfo
является указатель на первый узел в списке.

Каждый узел в возвращаемом списке имеет тип

struct addrinfo
и специфицирует один адрес, соответствующий запросу. Каждый адрес содержит не только IPv4- или IPv6-адрес, он также определяет тип соединения (например, дейтаграмма) и протокол (такой как UDP). Если для одного IP-адреса в запросе подходит несколько типов соединений, то данный адрес включается в несколько узлов.

Каждый узел содержит описанную ниже информацию.

• 

ai_family
— семейство протоколов (
PF_INET
или
PF_INET6
), к которому принадлежит адрес.

• 

ai_socktype
— тип соединения для адреса (как правило, принимает одно из значений
SOCK_STREAM
,
SOCK_DGRAM
или
SOCK_RAW
).

• 

ai_protocol
— протокол для адреса (обычно
IPPROTO_TCP
или
IPPROTO_UDP
).

• Если в параметре

hints
был указан флаг
AI_CANONNAME
, то
ai_canonname
содержит каноническое имя для адреса.

• 

ai_addr
указывает на
struct sockaddr
для соответствующего протокола. Например, если
ai_family
принимает значение
PF_INET
, то
ai_addr
указывает на
struct sockaddr_in
. Член
ai_addrlen
определяет длину структуры, на которую указывает
ai_addr
.

• Если предусмотрен параметр

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

• Если не был передан параметр

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

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

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

Поделиться:
Популярные книги

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Вадбольский

Никитин Юрий Александрович
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Вадбольский

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Таня Гроттер и магический контрабас

Емец Дмитрий Александрович
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Таня Гроттер и магический контрабас

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХI

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Потусторонний. Книга 1

Погуляй Юрий Александрович
1. Господин Артемьев
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Потусторонний. Книга 1