Разработка приложений в среде 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
. Большинство клиентских программ стремятся превратить имя хоста, передаваемое пользователем, и имя службы, известное программе, в полностью определенный адрес, с которым пользователь может установить соединение. Достичь этой цели нетрудно. Ниже приводится программа, которая принимает имя хоста как первый аргумент и имя службы как второй, после чего выполняет все необходимые преобразования.
Поделиться:
Популярные книги
Не кровный Брат
Любовные романы:
эро литература
6.83
рейтинг книги
Релокант
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Гром над Тверью
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Ненастоящий герой. Том 1
1. Ненастоящий герой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Попаданка
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Беглец
15. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Приручитель женщин-монстров. Том 6
6. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Неудержимый. Книга IX
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Измена. За что ты так со мной
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Испорченная свадьба
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Курсант: назад в СССР 9
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лорд Системы 12
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00