Читаем UNIX: разработка сетевых приложений полностью

На рис. 27.6 показан формат объектов вспомогательных данных, используемый для отправки и получения параметров транзитных узлов и параметров получателя.

Рис. 27.6. Объекты вспомогательных данных, используемые для параметров транзитных узлов и параметров получателя

Чтобы уменьшить объем дублированного кода, определены семь функций, которые создают и обрабатывают эти вспомогательные объекты данных. Следующие четыре функции формируют отправляемый параметр.

#include

int inet6_opt_init(void *extbuf, socklen_t extlen);

Возвращает: количество байтов для размещения пустого заголовка расширения, -1 в случае ошибки

int inet6_opt_append(void *extbuf, socklen_t extlen,

 int offset, uint8_t type, socklen_t len, uint_t align, void **databufp);

Возвращает: длину расширяющего заголовка после добавления параметра, -1 в случае ошибки

int inet6_opt_finish(void *extbuf, socklen_t extlen, int offset);

Возвращает: длину законченного заголовка расширения, -1 в случае ошибки

int inet6_opt_set_val(void *databuf, int offset,

 const void *val, socklen_t vallen);

Возвращает: новое смещение в буфере databuf

Функция inet6_opt_init возвращает количество байтов, необходимое для данного параметра. Если аргумент extbuf не является нулевым указателем, функция инициализирует заголовок расширения. Значение -1 возвращается при аварийном завершении работы в том случае, если аргумент extlen не кратен 8. (Все заголовки параметров транзитных узлов и получателя в IPv6 должны быть кратны 8.)

Функция inet6_opt_append возвращает общую длину заголовка расширения после добавления указанного при вызове параметра. Если аргумент extbuf не является нулевым указателем, функция дополнительно выполняет инициализацию параметра и вставляет необходимое заполнение. Значение -1 возвращается в случае аварийного завершения работы, если параметр не помещается в выделенный буфер. Аргумент offset представляет собой текущую полную длину, то есть значение, возвращенное при предыдущем вызове inet6_opt_append или inet6_opt_init. Аргументы type и len задают тип и длину параметра, они копируются непосредственно в его заголовок. Аргумент align указывает условие выравнивания, то есть значение x из выражения xn + y. Значение у вычисляется по align и len, поэтому указывать его явным образом необходимости нет. Аргумент databufp представляет собой адрес будущего указателя на значение параметра. Значение параметра копируется вызывающим процессом при помощи функции inet6_opt_set_val или любым другим методом.

Для завершения расширяющего заголовка вызывается функция inet6_opt_finish, которая добавляет в заголовок заполнение, делая его длину кратной 8 байтам. Как и раньше, заполнение добавляется в буфер только в том случае, если аргумент extbuf представляет собой непустой указатель. В противном случае функция вычисляет обновленное значение длины. Подобно inet6_opt_append, аргумент offset задает текущую полную длину (значение, возвращаемое inet6_opt_append и inet6_opt_init). Функция inet6_opt_finish возвращает полную длину возвращаемого заголовка или -1, если требуемое заполнение не помещается в предоставленный буфер.

Функция inet6_opt_set_val копирует значение параметра в буфер данных, возвращаемый inet6_opt_append. Аргумент databuf представляет собой указатель, возвращаемый inet6_opt_append. Аргумент offset представляет собой текущую длину внутри параметра, его необходимо инициализировать нулем для каждого параметра, а затем использовать возвращаемые inet6_opt_set_val значения по мере построения параметра. Аргументы val и vallen определяют значение для копирования в буфер значения параметра.

Перейти на страницу:

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

Похожие книги