-->

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

На нашем литературном портале можно бесплатно читать книгу UNIX: разработка сетевых приложений, Стивенс Уильям Ричард-- . Жанр: ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX: разработка сетевых приложений
Название: UNIX: разработка сетевых приложений
Дата добавления: 16 январь 2020
Количество просмотров: 381
Читать онлайн

UNIX: разработка сетевых приложений читать книгу онлайн

UNIX: разработка сетевых приложений - читать бесплатно онлайн , автор Стивенс Уильям Ричард

Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

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

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

Функция

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
определяют значение для копирования в буфер значения параметра.

Предполагается, что с помощью этих функций вы будете делать два прохода по списку параметров, которые вы предполагаете вставить: во время первого прохода будет вычисляться требуемая длина буфера, а во время второго прохода — выполняться фактическое построение буфера параметра. При первом проходе нужно вызвать

inet6_opt_init
,
inet6_opt_append
(один раз для каждого параметра) и
inet6_opt_finish
, передавая нулевой указатель и 0 в качестве аргументов
extbuf
и
extlen
соответственно. Затем можно динамически выделить буфер, использовав в качестве размера значение, возвращенное
inet6_opt_finish
. Этот буфер будет передаваться в качестве аргумента
extbuf
при втором проходе. Во время второго прохода вызываются функции
inet6_opt_init
и
inet6_opt_append
. Копирование значений параметров может выполняться как «вручную», так и при помощи функции
inet6_opt_set_val
. Наконец, мы должны вызвать
inet6_opt_finish
. Альтернативный вариант действий состоит в выделении буфера достаточно большого размера для нашего параметра. В этом случае первый проход можно не выполнять. Однако если изменение параметров приведет к переполнению выделенного буфера, в программе возникнет ошибка.

Оставшиеся три функции обрабатывают полученный параметр.

#include &lt;netinet/in.h&gt;

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
предназначены для возвращения функцией типа, длины и значения параметра соответственно. Функция
inet6_opt_next
возвращает -1 в случае обработки заголовка с нарушенной структурой или в случае достижения конца буфера.

Перейти на страницу:
Комментариев (0)
название