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

на главную

Жанры

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

Следующей из рассматриваемых нами функций, связанных с параметром маршрутизации, полученный маршрут от отправителя передается в формате, показанном на рис. 27.2. Затем она выводит соответствующую информацию. Эту функцию

inet_srtcrt_print
мы показываем в листинге 27.3.

Листинг 27.3. Функция inet_srtcrt_print: вывод полученного маршрута от отправителя

//ipopts/sourceroute.c

37 void

38 inet_srcrt_print(u_char *ptr, int len)

39 {

40 u_char c;

41 char str[INET_ADDRSTRLEN];

42 struct in_addr hop1;

43 memcpy(&hop1, ptr, sizeof(struct in_addr));

44 ptr += sizeof(struct in_addr);

45 while ((c = *ptr++) == IPOPT_NOP); /*
пропуск параметров NOP */

46 if (с == IPOPT_LSRR)

47 printf("received LSRR: ");

48 else if (c == IPOPT_SSRR)

49 printf("received SSRR: ");

50 else {

51 printf("received option type %d\n", c);

52 return;

53 }

54 printf("%s ", Inet_ntop(AF_INET, &hop1, str, sizeof(str)));

55 len = *ptr++ - sizeof(struct in_addr); /* вычитаем адрес получателя */

56 ptr++; /* пропуск указателя */

57 while (len > 0) {

58 printf("%s ", Inet_ntop(AF_INET, ptr, str, sizeof(str)));

59 ptr += sizeof(struct in_addr);

60 len -= sizeof(struct in_addr);

61 }

62 printf("\n");

63 }

Сохраняем первый адрес IP, пропускаем все параметры NOP

43-45
Первый IP-адрес в буфере сохраняется, а все следующие за ним параметры NOP мы пропускаем.

Проверяем параметр маршрута от отправителя

46-62
Мы выводим информацию о маршруте и проверяем значение поля
code
, содержащегося в 3-байтовом заголовке, получаем значение поля
len
и пропускаем указатель
ptr
. Затем мы выводим все IP-адреса, следующие за 3-байтовым заголовком, кроме IP-адреса получателя.

Пример

Теперь мы модифицируем наш эхо-сервер TCP таким образом, чтобы выводить полученный маршрут от отправителя,

а эхо-клиент TCP — так, чтобы маршрут от отправителя можно было задавать. В листинге 27.4 показан код эхо-клиента TCP.

Листинг 27.4. Эхо-клиент TCP, задающий маршрут от отправителя

//ipopts/tcpcli01.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

4 {

5 int c, sockfd, len = 0;

6 u_char *ptr = NULL;

7 struct addrinfo *ai;

8 if (argc < 2)

9 err_quit("usage: tcpcli01 [ -[gG] <hostname> ... ] <hostname>");

10 opterr = 0; /* отключаем запись сообщений getopt в stderr */

11 while ((с = getopt(argc, argv, "gG")) != -1) {

12 switch (c) {

13 case 'g': /* свободный маршрут от отправителя */

14 if (ptr)

15 err_quit("can't use both -g and -G");

16 ptr = inet_srcrt_init(0);

17 break;

18 case 'G': /* жесткий маршрут от отправителя */

19 if (ptr)

20 err_qint("can't use both -g and -G");

21 ptr = inet_srcrt_init(1);

22 break;

23 case '?':

24 err_quit("unrecognized option: %c", c);

25 }

26 }

27 if (ptr)

28 while (optind < argc-1)

29 len = inet_srcrt_add(argv[optind++]);

30 else if (optind < argc-1)

31 err_quit("need -g or -G to specify route");

32 if (optind != argc-1)

33 err_quit("missing <hostname>");

34 ai = Host_serv(argv[optind], SERV_PORT_STR, AF_INET, SOCK_STREAM);

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

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

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

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

Не ангел хранитель

Рам Янка
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Не ангел хранитель

Право налево

Зика Натаэль
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Право налево

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Фараон

Распопов Дмитрий Викторович
1. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Фараон

Инквизитор Тьмы

Шмаков Алексей Семенович
1. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Сам себе властелин 2

Горбов Александр Михайлович
2. Сам себе властелин
Фантастика:
фэнтези
юмористическая фантастика
6.64
рейтинг книги
Сам себе властелин 2

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Повелитель механического легиона. Том VI

Лисицин Евгений
6. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VI

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник

Наследница долины Рейн

Арниева Юлия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Наследница долины Рейн