Рис. 22.3. Процессы, происходящие на автономном параллельном UDP-сервере
Если используется демон inetd
, сценарий включает еще один шаг. Вспомните из табл. 13.4, что большинство серверов UDP задают аргумент wait-flag
как wait
. В описании, которое следовало за рис. 13.4, мы сказали, что при указанном значении этого флага демон inetd
приостанавливает выполнение функции select
на сокете до завершения дочернего процесса, давая возможность этому дочернему процессу считать дейтаграмму, доставленную на сокет. На рис. 22.4 показаны все шаги.
Рис. 22.4. Параллельный сервер UDP, запущенный демоном inetd
Сервер TFTP, являясь дочерним процессом функции inetd
, вызывает функцию recvfrom
и считывает клиентский запрос. Затем он с помощью функции fork
порождает собственный дочерний процесс, и этот дочерний процесс будет обрабатывать клиентский запрос. Затем сервер TFTP вызывает функцию exit
, отправляя демону inetd
сигнал SIGCHLD
, который, как мы сказали, указывает демону inetd
снова вызвать функцию select
на сокете, связанном с портом UDP 69.
22.8. Информация о пакетах IPv6
IPv6 позволяет приложению определять до пяти характеристик исходящей дейтаграммы:
■ IPv6-адрес отправителя;
■ индекс интерфейса для исходящих дейтаграмм;
■ предельное количество транзитных узлов для исходящих дейтаграмм;
■ адрес следующего транзитного узла;
■ класс исходящего трафика.
Эта информация отправляется в виде вспомогательных данных с функцией sendmsg
. Для сокета можно задать постоянные параметры, которые будут действовать на все отправляемые пакеты (раздел 27.7).
Для полученного пакета могут быть возвращены четыре аналогичных характеристики. Они возвращаются в виде вспомогательных данных с функцией recvmsg
:
■ IPv6-адрес получателя;
■ индекс интерфейса для входящих дейтаграмм;
■ предельное количество транзитных узлов для входящих дейтаграмм.
■ класс входящего трафика.
На рис. 22.5 показано содержимое вспомогательных данных, о которых рассказывается далее.
Рис. 22.5. Вспомогательные данные для информации о пакете IPv6
Структура in6_pktinfo
содержит либо IPv6-адрес отправителя и индекс интерфейса для исходящей дейтаграммы, либо IPv6-адрес получателя и индекс интерфейса для получаемой дейтаграммы:
struct in6_pktinfo {
struct in6_addr ipi6_addr; /* IPv6-адрес отправителя/получателя */
int ipi6_ifindex; /* индекс интерфейса для исходящей/получаемой дейтаграммы */
};
Эта структура определяется в заголовочном файле , подключение которого позволяет ее использовать. В структуре cmsghdr
, содержащей вспомогательные данные, элемент cmsg_level
будет иметь значение IPPROTO_IPV6
, элемент cmsg_type
будет равен IPV6_PKTINFO
и первый байт данных будет первым байтом структуры in6_pktinfo
. В примере, приведенном на рис. 22.5, мы считаем, что между структурой cmsghdr
и данными нет заполнения и целое число занимает 4 байта.
Чтобы отправить эту информацию, никаких специальных действий не требуется — нужно только задать управляющую информацию во вспомогательных данных функции sendmsg
. Чтобы информация добавлялась ко всем отправляемым через сокет пакетам, необходимо установить параметр сокета IPV6_PKTINFO
со значением in6_pktinfo
. Возвращать эту информацию функция recvmsg
будет, только если приложение включит параметр сокета IPV6_RECVPKTINFO
.
Исходящий и входящий интерфейсы
Интерфейсы на узле IPv6 идентифицируются небольшими целыми положительными числами, как мы сказали в разделе 18.6. Вспомните, что ни одному интерфейсу не может быть присвоен нулевой индекс. При задании исходящего интерфейса ядро само выберет исходящий интерфейс, если значение ipi6_ifindex
нулевое. Если приложение задает исходящий интерфейс для пакета многоадресной передачи, то любой интерфейс, заданный параметром сокета IPV6_MULTICAST_IF
, заменяется на интерфейс, заданный вспомогательными данными (но только для данной дейтаграммы).
Адрес отправителя и адрес получателя IPv6
Читать дальше
Конец ознакомительного отрывка
Купить книгу