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

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

Жанры

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

14 }

15 /* следующую ошибку тоже игнорируем; придется обойтись без вывода

ограничения на количество транзитных узлов */

16 #ifdef IPV6_RECVHOPLIMIT

17 /* RFC 3542 */

18 setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof(on));

19 #else

20 /* RFC 2292 */

21 setsockopt(sockfd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof(on));

22 #endif

23 #endif

24 }

Приведенная

в листинге 28.8 функция
proc_v6
обрабатывает входящие пакеты.

Листинг 28.8.Функция proc_v6: обработка сообщений ICMPv6

//ping/proc_v6.c

1 #include "ping.h"

2 void

3 proc_v6(char *ptr, ssize_t len, struct msghdr *msg, struct timeval* tvrecv)

4 {

5 #ifdef IPV6

6 double rtt;

7 struct icmp6_hdr *icmp6;

8 struct timeval *tvsend;

9 struct cmsghdr *cmsg;

10 int hlim;

11 icmp6 = (struct icmp6_hdr*)ptr;

12 if (len < 8)

13 return; /* плохой пакет */

14 if (icmp6->icmp6_type == ICMP6_ECHO_REPLY) {

15 if (icmp6->icmp6_id != pid)

16 return; /* это не ответ на наш ECHO_REQUEST */

17 if (len < 16)

18 return; /* недостаточно данных */

19 tvsend = (struct timeval*)(icmp6 + 1);

20 tv_sub(tvrecv, tvsend);

21 rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;

22 hlim = -1;

23 for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;

24 cmsg = CMSG_NXTHDR(msg, cmsg)) {

25 if (cmsg->cmsg_level == IPPROTO_IPV6 &&

26 cmsg->cmsg_type == IPV6_HOPLIMIT) {

27 hlim = *(u_int32_t*)CMSG_DATA(cmsg);

28 break;

29 }

30 }

31 printf("%d bytes from %s; seq=%u, hlim=",

32 len, Sock_ntop__host(pr->sarecv, pr->salen), icmp6->icmp6_seq);

33 if (hlim == -1)

34 printf("???"); /*
отсутствуют вспомогательные данные */

35 else

36 printf("%d", hlim);

37 printf(", rtt=%.3f ms\n", rtt);

38 } else if (verbose) {

39 printf(" %d bytes from type = %d, code = %d\n",

40 len, Sock_ntop_host(pr->sarecv, pr->salen);

41 icmp6->icmp6, type, icmp6->icmp6_code);

42 }

43 #endif /* IPV6 */

44 }

Извлечение указателя на заголовок ICMPv6

11-13
Заголовок ICMPv6 возвращается внутри данных при чтении из сокета. (Напомним, что дополнительные заголовки IPv6, если они присутствуют, всегда возвращаются не как стандартные данные, а как вспомогательные.) На рис. 28.4 приведены различные заголовки, указатели и длина, используемые в коде.

Рис. 28.4. Заголовки, указатели и длина при обработке ответов ICMPv6

Проверка эхо-ответа ICMP

14-37
Если ICMP-сообщение является эхо-ответом, то чтобы убедиться, что ответ предназначен для нас, мы проверяем поле идентификатора. Если это подтверждается, то вычисляется значение RTT, которое затем выводится вместе с порядковым номером и предельным количеством транзитных узлов IPv4. Ограничение на количество транзитных узлов мы получаем из вспомогательных данных
IPV6_HOPLIMIT
.

Вывод всех полученных ICMP-сообщений при включении параметра verbose

38-42
Если пользователь указал параметр командной строки
– v
, выводятся также поля типа и кода всех остальных получаемых ICMP-сообщений.

Обработчиком сигнала SIGALRM является функция

sig_alrm
, приведенная в листинге 28.9. В листинге 28.4 функция readloop вызывает обработчик сигнала один раз для отправки первого пакета. Эта функция в зависимости от протокола вызывает функцию
send_v4
или
send_v6
для отправки эхо-запроса ICMP и далее программирует запуск другого сигнала
SIGALRM
через 1 с.

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

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

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

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

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