Эффективное программирование TCP-IP



         

Печать ICMP-сообщений - часть 2


48   else if ( icmp->icmp_type == ICMP_TIMXCEED )

49     printf( "\tTTL == 0 при %s\n", icmp->icmp_code <= 1 ?

50      timexceed_code[ icmp->icmp_code] : "Некорректный код" );

51   else if ( icmp->icmp_type == ICMP_PARAMPROB )

52     printf ( "\t%s\n", icmp->icmp_code <= 1 ?

53      param_code[ icmp->icmp_code ] : "Некорректный код" );

54   }

Получение указателя на IP-заголовок и проверка корректности пакета

21 Записываем в переменную ip указатель на только что прочитанную датаграмму, приведенный к типу struct ip *.

22-26 Поле ip_v - это версия протокола IP. Если протокол не совпадает с IPv4, то печатаем сообщение об ошибке и выходим.

27-33 Поле ip_hl содержит длину заголовка в 32-байтных словах. Умножаем его на 4, чтобы получить длину в байтах, и сохраняем результат в переменной hl. Затем проверяем, что длина ICMP-сообщения не меньше минимально допустимой величины.

Получение имени хоста отправителя

34-38 Используем адрес источника в ICMP-сообщении, чтобы найти имя хоста отправителя. Если gethostbyaddr вернет NULL, то записываем в hname пустую строку, в обратном случае - имя хоста.

Пропуск IP-заголовка и печать отправителя и типа

39-42 Устанавливаем указатель icmp на первый байт, следующий за IP-заголовком. Этот указатель используется далее для получения типа ICMP-сообщения (icmp_type) и печати типа, адреса и имени хоста отправителя. Для получения ASCII-представления типа ICMP вызываем функцию get_type, текст которой приведен в листинге 4.5.

Печать информации, соответствующей типу

43-44 Если это одно из ICMP-сообщений о недоступности, то вызываем функцию print_unreachable (листинг 4.6) для печати дополнительной информации.

45-47 Если это сообщение о перенаправлении, то получаем тип перенаправления из поля icmp_code и печатаем его.

48-50 Если это сообщение об истечении времени существования, из поля icmp_code узнаем, произошло ли это во время транзита или сборки датаграммы, и печатаем результат.




Содержание  Назад  Вперед