Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:
Проверка эхо-ответа 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 с.

Листинг 28.9. Функция sig_alrm: обработчик сигнала SIGALRM

//ping/sig_alrm.c

1 #include "ping.h"

2 void

3 sig_alrm(int signo)

4 {

5 (*pr->fsend);

6 alarm(1);

7 return;

8 }

Функция

send_v4
, приведенная в листинге 28.10, строит ICMPv4 сообщение эхо-запроса и записывает его в символьный сокет.

Листинг 28.10. Функция send_v4: построение эхо-запроса ICMPv4 и его отправка

//ping/send_v4.c

1 #include "ping.h"

2 void

3 send_v4(void)

4 {

5 int len;

6 struct icmp *icmp;

7 icmp = (struct icmp*)sendbuf;

8 icmp->icmp_type = ICMP_ECHO;

9 icmp->icmp_code = 0;

10 icmp->icmp_id = pid;

11 icmp->icmp_seq = nsent++;

12 memset(icmp->icmp_data, 0xa5, datalen); /* заполнение по шаблону */

13 Gettimeofday((struct timeval*)icmp->icmp_data, NULL);

14 len = 8 + datalen; /* контрольная сумма по заголовку и данным */

15 icmp->icmp_cksum = 0;

16 icmp->icmp_cksum = in_cksum((u_short*)icmp, len);

17 Sendto(sockfd, sendbuf, len, 0, pr->sasend, pr->salen);

18 }

Формирование ICMP-сообщения

7-13
ICMPv4 сообщение сформировано. В поле идентификатора установлен идентификатор нашего процесса, а порядковый номер установлен как глобальная переменная
nset
, которая затем увеличивается на 1 для следующего пакета. Текущее время сохраняется в части данных ICMP-сообщения.

Вычисление контрольной суммы ICMP

14-16
Для вычисления контрольной суммы ICMP значение поля контрольной суммы устанавливается равным 0, затем вызывается функция
in_cksum
, а результат сохраняется в поле контрольной суммы. Контрольная сумма ICMPv4 вычисляется по ICMPv4-заголовку и всем следующим за ним данным.

Отправка дейтаграммы

17
ICMP-сообщение отправлено на символьный сокет. Поскольку параметр сокета
IP_HDRINCL
не установлен, ядро составляет заголовок IPv4 и добавляет его в начало нашего буфера.

Контрольная сумма Интернета является суммой обратных кодов 16-разрядных значений. Если длина данных является нечетным числом, то для вычисления контрольной суммы к данным дописывается один нулевой байт. Перед вычислением контрольной суммы поле контрольной суммы должно быть установлено в 0. Такой алгоритм применяется для вычисления контрольных сумм IPv4, ICMPv4, IGMPv4, ICMPv6, UDP и TCP. В RFC 1071 [12] содержится дополнительная информация и несколько числовых примеров. В разделе 8.7 книги [128] более подробно рассказывается об этом алгоритме, а также приводится более эффективная его реализация. В нашем случае контрольную сумму вычисляет функция

in_cksum
, приведенная в листинге 28.11.

  • Читать дальше
  • 1
  • ...
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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