UNIX: разработка сетевых приложений
Часть 302 из 399 Информация о книге
<i>Возвращает: новое смещение в буфере databuf</i>Функция
возвращает количество байтов, необходимое для данного параметра. Если аргументinet6_opt_initне является нулевым указателем, функция инициализирует заголовок расширения. Значение -1 возвращается при аварийном завершении работы в том случае, если аргументextbufне кратен 8. (Все заголовки параметров транзитных узлов и получателя в IPv6 должны быть кратны 8.)extlenФункция
возвращает общую длину заголовка расширения после добавления указанного при вызове параметра. Если аргументinet6_opt_appendне является нулевым указателем, функция дополнительно выполняет инициализацию параметра и вставляет необходимое заполнение. Значение -1 возвращается в случае аварийного завершения работы, если параметр не помещается в выделенный буфер. Аргументextbufпредставляет собой текущую полную длину, то есть значение, возвращенное при предыдущем вызовеoffsetилиinet6_opt_append. Аргументыinet6_opt_initиtypeзадают тип и длину параметра, они копируются непосредственно в его заголовок. Аргументlenуказывает условие выравнивания, то есть значение x из выражения xn + y. Значение у вычисляется поalignиalign, поэтому указывать его явным образом необходимости нет. Аргументlenпредставляет собой адрес будущего указателя на значение параметра. Значение параметра копируется вызывающим процессом при помощи функцииdatabufpили любым другим методом.inet6_opt_set_valДля завершения расширяющего заголовка вызывается функция
, которая добавляет в заголовок заполнение, делая его длину кратной 8 байтам. Как и раньше, заполнение добавляется в буфер только в том случае, если аргументinet6_opt_finishпредставляет собой непустой указатель. В противном случае функция вычисляет обновленное значение длины. Подобноextbuf, аргументinet6_opt_appendзадает текущую полную длину (значение, возвращаемоеoffsetиinet6_opt_append). Функцияinet6_opt_initвозвращает полную длину возвращаемого заголовка или -1, если требуемое заполнение не помещается в предоставленный буфер.inet6_opt_finishФункция
копирует значение параметра в буфер данных, возвращаемыйinet6_opt_set_val. Аргументinet6_opt_appendпредставляет собой указатель, возвращаемыйdatabuf. Аргументinet6_opt_appendпредставляет собой текущую длину внутри параметра, его необходимо инициализировать нулем для каждого параметра, а затем использовать возвращаемыеoffsetзначения по мере построения параметра. Аргументыinet6_opt_set_valиvalопределяют значение для копирования в буфер значения параметра.vallenПредполагается, что с помощью этих функций вы будете делать два прохода по списку параметров, которые вы предполагаете вставить: во время первого прохода будет вычисляться требуемая длина буфера, а во время второго прохода — выполняться фактическое построение буфера параметра. При первом проходе нужно вызвать
,inet6_opt_init(один раз для каждого параметра) иinet6_opt_append, передавая нулевой указатель и 0 в качестве аргументовinet6_opt_finishиextbufсоответственно. Затем можно динамически выделить буфер, использовав в качестве размера значение, возвращенноеextlen. Этот буфер будет передаваться в качестве аргументаinet6_opt_finishпри втором проходе. Во время второго прохода вызываются функцииextbufиinet6_opt_init. Копирование значений параметров может выполняться как «вручную», так и при помощи функцииinet6_opt_append. Наконец, мы должны вызватьinet6_opt_set_val. Альтернативный вариант действий состоит в выделении буфера достаточно большого размера для нашего параметра. В этом случае первый проход можно не выполнять. Однако если изменение параметров приведет к переполнению выделенного буфера, в программе возникнет ошибка.inet6_opt_finishОставшиеся три функции обрабатывают полученный параметр.
#include <netinet/in.h>int inet6_opt_next(const void *<i>extbuf</i>, socklen_t <i>extlen</i>,int <i>offset</i>, uint8_t *<i>typep</i>, socklen_t *<i>lenp</i>, void **<i>databufp</i>);<i>Возвращает: смещение следующего параметра, -1 в случае достижения конца списка параметров или в случае ошибки</i>int inet6_opt_find(const void *<i>extbuf</i>, socklen_t <i>extlen</i>,int <i>offset</i>, uint8_t <i>type</i>, socklen_t *<i>lenp</i>, void **<i>databufp</i>);<i>Возвращает: смещение следующего параметра, -1 в случае достижения конца списка параметров или в случае ошибки</i>int inet6_opt_get_val(const void *<i>databuf</i>, int <i>offset</i>, void *<i>val</i>, socklen_t <i>vallen</i>);<i>Возвращает: новое значение смещения внутри буфера databuf</i>Функция
обрабатывает следующий параметр в буфере. Аргументыinet6_opt_nextиextbufопределяют буфер, в котором содержится заголовок. Как и уextlen, аргументinet6_opt_appendпредставляет собой текущее смещение внутри буфера. При первом вызовеoffsetзначение этого аргумента должно быть равно нулю, а при всех последующих — значению, возвращенному при предыдущем вызове функции. Аргументыinet6_opt_next,typepиlenpпредназначены для возвращения функцией типа, длины и значения параметра соответственно. Функцияdatabufpвозвращает -1 в случае обработки заголовка с нарушенной структурой или в случае достижения конца буфера.inet6_opt_next