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-клиент
Листинг 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
рейтинг книги
Совок 2
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Один на миллион. Трилогия
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Мне нужна жена
Любовные романы:
современные любовные романы
6.88
рейтинг книги
Магнатъ
4. Александр Агренев
Приключения:
исторические приключения
8.83
рейтинг книги
На границе империй. Том 8. Часть 2
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Системный Нуб
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Не верь мне
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Столичный доктор
1. Столичный доктор
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
LIVE-RPG. Эволюция 2
2. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.29
рейтинг книги
Изгой. Пенталогия
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Мама из другого мира. Делу - время, забавам - час
2. Королевский приют имени графа Тадеуса Оберона
Фантастика:
фэнтези
8.83
рейтинг книги
Неудержимый. Книга X
10. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Его темная целительница
2. Любовь среди туманов
Фантастика:
фэнтези
5.75