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

Тут можно читать онлайн Уильям Стивенс - UNIX: разработка сетевых приложений - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Питер, год 2007. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX: разработка сетевых приложений
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2007
  • Город:
    Санкт-Петербург
  • ISBN:
    5-94723-991-4
  • Рейтинг:
    4.33/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

UNIX: разработка сетевых приложений - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Уильям Стивенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

27.6. Заголовок маршрутизации IPv6

Заголовок маршрутизации IPv6 используется для маршрутизации от отправителя в IPv6. Первые два байта заголовка маршрутизации такие же, как показанные на рис. 27.3: поле следующего заголовка ( next header ) и поле длины заголовка расширения ( header extension length ). Следующие два байта задают тип маршрутизации ( routing type ) и количество оставшихся сегментов ( number of segments left ) (то есть сколько из перечисленных узлов еще нужно пройти). Определен только один тип заголовка маршрутизации, обозначаемый как тип 0. Формат заголовка маршрутизации показан на рис. 27.7.

Рис 278 Объект вспомогательных данных для заголовка маршрутизации IPv6 - фото 132

Рис. 27.8. Объект вспомогательных данных для заголовка маршрутизации IPv6

Функция inet6_rth_spaceвозвращает количество байтов, необходимое для размещения объекта вспомогательных данных, содержащего заголовок маршрутизации указанного типа (обычно это IPV6_RTHDR_TYPE_0) с заданным количеством сегментов.

Функция inet6_rth_initинициализирует буфер, на который указывает аргумент rthbuf, для помещения заголовка маршрутизации типа type и заданного количества сегментов. Возвращаемое значение этой функции — указатель на буфер. Этот указатель используется как аргумент при вызове следующей функции. Функция inet6_rth_initвозвращает NULLв случае возникновения ошибок (например, при недостаточном размере предоставленного буфера).

Функция inet6_rth_addдобавляет адрес IPv6, на который указывает аргумент addr, к концу составляемого заголовка маршрутизации. В случае успешного выполнения обновляется значение элемента segleftзаголовка маршрутизации, чтобы учесть добавленный новый адрес.

Следующие три функции манипулируют полученным заголовком маршрутизации:

#include

int inet6_rth_reverse(const void * in , void * out );

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

int inet6_rth_segments(const void * rthbuf );

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

struct in6_addr *inet6_rth_getaddr(const void * rthbuf , int index );

Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки

Функция inet6_rth_reverseпринимает в качестве аргумента заголовок маршрутизации, полученный в виде объекта вспомогательных данных (на который указывает аргумент in), и создает новый заголовок маршрутизации (в буфере, на который указывает аргумент out), отправляющий дейтаграммы по обратному маршруту. Указатели in и out могут указывать на один и тот же буфер.

Функция inet6_rth_segmentsвозвращает количество сегментов в заголовке маршрутизации, на который указывает rthbuf. В случае успешного выполнения функции возвращаемое значение оказывается больше 0.

Функция inet6_rth_getaddrвозвращает указатель на адрес IPv6, заданный через indexв заголовке маршрутизации rthbuf. Аргумент indexдолжен лежать в пределах от 1 до значения, возвращенного функцией inet6_rth_segments, включительно.

Чтобы продемонстрировать использование этих параметров, мы создали UDP-клиент и UDP-сервер. Клиент представлен в листинге 27.5. Он принимает маршрут от отправителя в командной строке подобно TCP-клиенту IPv4, представленному в листинге 27.4. Сервер печатает маршрут полученного сообщения и обращает этот маршрут для отправки сообщения в обратном направлении.

Листинг 27.5. UDP-клиент, использующий маршрутизацию от отправителя

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

4 {

5 int с, sockfd, len = 0;

6 u_char *ptr = NULL;

7 void *rth;

8 struct addrinfo *ai;

9 if (argc

10 err_quit("usage: udpcli01 [ ... ] ");

11 if (argc > 2) {

12 int i;

13 len = Inet6_rth_space(IPV6_RTHDR_TYPE_0, argc-2);

14 ptr = Malloc(len);

15 Inet6_rth_init(ptr, len, IPV6_RTHDR_TYPE_0, argc-2);

16 for (i = 1; i

17 ai = Host_serv(argv[i], NULL, AF_INET6, 0);

18 Inet6_rth_add(ptr,

19 &((struct sockaddr_in6*)ai->ai_addr)->sin6_addr);

20 }

21 }

22 ai = Host_serv(argv[argc-1], SERV_PORT_STR, AF_INET6, SOCK_DGRAM);

23 sockfd = Socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);

24 if (ptr) {

25 Setsockopt(sockfd, IPPROTO_IPV6, IPV6_RTHDR, ptr, len);

26 free(ptr);

27 }

28 dg_cli(stdin, sockfd, ai->ai_addr, ai->ai_addrlen); /* do it all */

29 exit(0);

30 }

Создание маршрута

11-21 Если при вызове программы было указано более одного аргумента, все параметры командной строки, за исключением последнего, формируют маршрут от отправителя. Сначала мы определяем, какой объем памяти займет заголовок маршрутизации, при помощи функции inet6_rth_space, затем выделяем буфер соответствующего размера вызовом malloc. После этого каждый адрес маршрута преобразуется в числовую форму функцией host_servи добавляется к маршруту функцией inet6_rth_add. Примерно то же самое выполнял и TCP-клиент IPv4, за тем исключением, что здесь мы используем библиотечные функции, а не свои собственные.

Поиск адресата и создание сокета

22-23 Мы определяем адрес назначения при помощи host_servи создаем сокет для отправки пакетов.

Установка «закрепленного» параметра IPV6_RTHDR и вызов рабочей функции

24-27 В разделе 27.7 будет показано, что не обязательно отправлять одни и те же вспомогательные данные с каждым пакетом. Вместо этого можно вызвать setsockoptтаким образом, что один и тот же заголовок будет добавляться ко всем пакетам в рамках одного сеанса. Этот параметр устанавливается только в том случае, если указатель ptrне нулевой, то есть мы уже должны были выделить буфер под заголовок маршрутизации. На последнем этапе мы вызываем рабочую функцию dg_cli, которая не меняется с листинга 8.4.

Программа UDP-сервера не изменилась по сравнению с предыдущими примерами. Сервер открывает сокет и вызывает функцию dg_echo. В листинге 27.6 представлена функция dg_echo, печатающая информацию о маршруте от источника (если таковой был получен) и обращающая этот маршрут для отправки сообщения в обратном направлении.

Листинг 27.6. Функция dg_echo, печатающая маршрут

//ipopts/dgechoprintroute.c

1 #include "unp.h"

2 void

3 dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)

4 {

5 int n;

6 char mesg[MAXLINE];

7 int on;

8 char control[MAXLINE];

9 struct msghdr msg;

10 struct cmsghdr *cmsg;

11 struct iovec iov[1];

12 on = 1;

13 Setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVRTHDR, &on, sizeof(on));

14 bzero(&msg, sizeof(msg));

15 iov[0].iov_base = mesg;

16 msg.msg_name = pcliaddr;

17 msg.msg_iov = iov;

18 msg.msg_iovlen = 1;

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Уильям Стивенс читать все книги автора по порядку

Уильям Стивенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


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


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x