Чтение онлайн

на главную - закладки

Жанры

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

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

Рис. 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 <netinet/in.h>

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 < 2)

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

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 < argc-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, за тем исключением, что здесь мы используем библиотечные функции, а не свои собственные.

Поделиться:
Популярные книги

Отмороженный 6.0

Гарцевич Евгений Александрович
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 6.0

Совок 2

Агарев Вадим
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Совок 2

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Мне нужна жена

Юнина Наталья
Любовные романы:
современные любовные романы
6.88
рейтинг книги
Мне нужна жена

Магнатъ

Кулаков Алексей Иванович
4. Александр Агренев
Приключения:
исторические приключения
8.83
рейтинг книги
Магнатъ

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне

Столичный доктор

Вязовский Алексей
1. Столичный доктор
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Столичный доктор

LIVE-RPG. Эволюция 2

Кронос Александр
2. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.29
рейтинг книги
LIVE-RPG. Эволюция 2

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Мама из другого мира. Делу - время, забавам - час

Рыжая Ехидна
2. Королевский приют имени графа Тадеуса Оберона
Фантастика:
фэнтези
8.83
рейтинг книги
Мама из другого мира. Делу - время, забавам - час

Неудержимый. Книга X

Боярский Андрей
10. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга X

Его темная целительница

Крааш Кира
2. Любовь среди туманов
Фантастика:
фэнтези
5.75
рейтинг книги
Его темная целительница