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



         

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


Структура IP-датаграммы, прочитанной из простого сокета в составе ICMP-сообщения о недоступности, показана на рис. 4.22. Та часть, которую уже обработала функция print_dg, заштрихована, она не передается в print_unreachable. Приведены также входной параметр функции print_unreachable - icmp и локальные переменные ip и udp.

Рис. 4.22. ICMP-сообщение о недоступности

Функция print_unreachable извлекает информацию из заголовка и первых восьми байт включенной IP-датаграммы. Хотя вы пометили байты как UDP-заголовок, это мог быть и заголовок TCP: номера портов в обоих случаях находятся в одной и той же позиции. Формат UDP-заголовка показан на рис. 4.23.

Рис. 4.23. UDP-заголовок

Текст функции print_unreachable приведен в листинге 4.6.

Листинг4.6. Функцияprint_unreachable

1    static void print_unreachable( struct icmp *icmp )

2    {

3    struct ip *ip;

4    struct udphdr *udp;

5    char laddr[ 15 + 1 ] ;

6    static char *unreach[] =

7    {

8      "Сеть недоступна",                        /* 0 */

9      "Хост недоступен",                        /* 1 */

10     "Протокол недоступен",                    /* 2 */

11     "Порт недоступен",                        /* 3 */

12     "Нужна фрагментация, поднят бит DF",      /* 4 */

13     "Ошибка маршрутизации от источника",      /* 5 */

14     "Сеть назначения неизвестна",             /* 6 */

15     "Хост назначения неизвестен",             /* 7 */

16     "Хост источника изолирован",              /* 8 */

17     "Сеть назначения закрыта администратором ",    /* 9 */

18     "Хост назначения закрыт администратором ",     /* 10 */

19     "Сеть недоступна для типа сервиса",       /* 11 */

20     "Хост недоступен для типа сервиса",       /* 12 */

21     "Связь запрещена администратором",        /* 13 */

22     "Нарушение предшествования хостов",       /* 14 */

23     "Действует отсечка предшествования"       /* 15 */




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