22.8. Информация о пакетах IPv6
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; /* индекс интерфейса для исходящей/получаемой дейтаграммы */
};
Эта структура определяется в заголовочном файле <netinet/in.h>, подключение которого позволяет ее использовать. В структуре cmsghdr, содержащей вспомогательные данные, элемент cmsg_level будет иметь значение IPPROTO_IPV6, элемент cmsg_type будет равен IPV6_PKTINFO и первый байт данных будет первым байтом структуры in6_pktinfo. В примере, приведенном на рис. 22.5, мы считаем, что между структурой cmsghdr и данными нет заполнения и целое число занимает 4 байта.
Чтобы отправить эту информацию, никаких специальных действий не требуется — нужно только задать управляющую информацию во вспомогательных данных функции sendmsg. Чтобы информация добавлялась ко всем отправляемым через сокет пакетам, необходимо установить параметр сокета IPV6_PKTINFO со значением in6_pktinfo. Возвращать эту информацию функция recvmsg будет, только если приложение включит параметр сокета IPV6_RECVPKTINFO.
Данный текст является ознакомительным фрагментом.