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

на главную

Жанры

Разработка приложений в среде 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
рейтинг книги
Не кровный Брат

Релокант

Ascold Flow
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант

Гром над Тверью

Машуков Тимур
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Гром над Тверью

Ненастоящий герой. Том 1

N&K@
1. Ненастоящий герой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Ненастоящий герой. Том 1

Попаданка

Ахминеева Нина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка

Беглец

Кораблев Родион
15. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Беглец

Приручитель женщин-монстров. Том 6

Дорничев Дмитрий
6. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 6

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Измена. За что ты так со мной

Дали Мила
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. За что ты так со мной

Измена. Испорченная свадьба

Данич Дина
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Измена. Испорченная свадьба

Приручитель женщин-монстров. Том 4

Дорничев Дмитрий
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12