UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Функция
inet6_opt_find
Функция
inet6_opt_get_val
databuf
inet6_opt_next
inet6_opt_find
inet6_opt_set_val
offset
inet6_opt_get_val
27.6. Заголовок маршрутизации IPv6
Заголовок маршрутизации IPv6 используется для маршрутизации от отправителя в IPv6. Первые два байта заголовка маршрутизации такие же, как показанные на рис. 27.3: поле следующего заголовка (next header) и поле длины заголовка расширения (header extension length). Следующие два байта задают тип маршрутизации (routing type) и количество оставшихся сегментов (number of segments left) (то есть сколько из перечисленных узлов еще нужно пройти). Определен только один тип заголовка маршрутизации, обозначаемый как тип 0. Формат заголовка маршрутизации показан на рис. 27.7.
Рис. 27.7. Заголовок маршрутизации IPv6
В заголовке маршрутизации IPv6 может появиться неограниченное количество адресов (реальное ограничение накладывается длиной пакета), а количество оставшихся сегментов не должно превышать количество адресов в заголовке. Документ RFC 2460 [27] описывает подробности обработки этого заголовка при пересылке его в направлении получателя. Там же вы можете найти подробно рассмотренный пример.
Заголовок маршрутизации обычно задается как вспомогательные данные в функции
sendmsg
recvmsg
sendmsg
IPV6_RECVRTHDR
const int on = 1;
setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVRTHDR, &on, sizeof(on));
На рис. 27.8 показан формат объекта вспомогательных данных, используемый для отправки и получения заголовка маршрутизации. Для создания и обработки заголовка маршрутизации определены шесть функций. Следующие три функции используются для создания отправляемого параметра.
#include <netinet/in.h>
socklen_t inet6_rth_space(int <i>type</i>, int <i>segments</i>);
<i>Возвращает: положительное число, равное количеству байтов в случае успешного выполнения, 0 в случае ошибки</i>
void *inet6_rth_init(void *<i>rthbuf</i>, socklen_t <i>rthlen</i>, int <i>type</i>, int <i>segments</i>);
<i>Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки</i>
int inet6_rth_add(void *<i>rthbuf</i>, const struct in6_addr *<i>addr</i>);
Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки
Рис. 27.8. Объект вспомогательных данных для заголовка маршрутизации IPv6
Функция
inet6_rth_space
IPV6_RTHDR_TYPE_0
Функция
inet6_rth_init
rthbuf
inet6_rth_init
NULL
Функция
inet6_rth_add
addr
segleft
Следующие три функции манипулируют полученным заголовком маршрутизации:
#include <netinet/in.h>
int inet6_rth_reverse(const void *<i>in</i>, void *<i>out</i>);
<i>Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки</i>
int inet6_rth_segments(const void *<i>rthbuf</i>);
<i>Возвращает: количество сегментов в заголовке маршрутизации в случае успешного выполнения, -1 в случае ошибки</i>
struct in6_addr *inet6_rth_getaddr(const void *<i>rthbuf</i>, int <i>index</i>);
<i>Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки</i>
Функция
inet6_rth_reverse
in
out
Функция
inet6_rth_segments
rthbuf
Функция
inet6_rth_getaddr
index
rthbuf
index
inet6_rth_segments