Читаем UNIX: разработка сетевых приложений полностью

52      memcpy(dest.sin_addr, hip-ip_dst,

53       sizeof(struct in_addr));

54      dest.sin_port = udp-uh_dport;

55      icmpd_err.icmpd_type = icmp-icmp_type;

56      icmpd_err.icmpd_code = icmp-icmp_code;

57      icmpd_err.icmpd_len = sizeof(struct sockaddr_in);

58      memcpy(icmpd_err.icmpd_dest, dest, sizeof(dest));

59      /* преобразование кода и типа ICMP в значение errno */

60      icmpd_err.icmpd_errno = EHOSTUNREACH; /* по умолчанию */

61      if (icmp-icmp_type == ICMP_UNREACH) {

62       if (icmp-icmp_code == ICMP_UNREACH_PORT)

63        icmpd_err.icmpd_errno = ECONNREFUSED;

64       else if (icmp-icmp_code == ICMP_UNREACH_NEEDFRAG)

65        icmpd_err.icmpd_errno = EMSGSIZE;

66      }

67      Write(client[i].connfd, icmpd_err, sizeof(icmpd_err));

68     }

69    }

70   }

71  }

72  return(--nready);

73 }

Проверка типа сообщения, уведомление приложения

29-31 ICMP-сообщения, которые посылаются приложениям, — это сообщения о недоступности порта, превышении времени и завершении клиента (см. табл. 28.1).

Проверка ошибки UDP, поиск клиента

34-42 Указатель hipуказывает на IP-заголовок, который возвращается сразу после заголовка ICMP. Это IP-заголовок дейтаграммы, вызвавшей ICMP-ошибку. Мы убеждаемся, что эта IP-дейтаграмма является UDP-дейтаграммой, а затем извлекаем номер UDP-порта из UDP-заголовка, следующего за IP-заголовком.

43-55 По всем структурам clientосуществляется поиск подходящего семейства адресов и порта. Если соответствие найдено, строится структура адреса сокета IPv4, которая содержит IP-адрес получателя и порт из UDP-дейтаграммы, вызвавшей ошибку.

Построение структуры icmpd_err

56-70 Строится структура icmpd_err, посылаемая клиенту через доменный сокет Unix. Тип и код сообщения ICMP сначала отображаются в значение errno, как показано в табл. 28.1.

Ошибки ICMPv6 обрабатываются функцией readable_v6, первая часть которой приведена в листинге 28.31. Обработка ошибок ICMPv6 аналогична коду, приведенному в листингах 28.7 и 28.16.

Листинг 28.31. Обработка полученной дейтаграммы ICMPv6, первая часть

//icmpd/readable_v6.c

 1 #include "icmpd.h"

 2 #include netinet/in_systm.h

 3 #include netinet/ip.h

 4 #include netinet/ip_icmp.h

 5 #include netinet/udp.h

 6 #ifdef IPV6

 7 #include netinet/ip6.h

 8 #include netinet/icmp6.h

 9 #endif

10 int

11 readable_v6(void)

12 {

13 #ifdef IPV6

14  int i, hlen2, icmp6len, sport;

15  char buf[MAXLINE];

16  char srcstr[INET6_ADDRSTRLEN], dststr[INET6_ADDRSTRLEN];

17  ssize_t n;

18  socklen_t len;

19  struct ip6_hdr *ip6, *hip6;

20  struct icmp6_hdr *icmp6;

21  struct udphdr *udp;

22  struct sockaddr_in6 from, dest;

23  struct icmpd_err icmpd_err;

24  len = sizeof(from);

25  n = Recvfrom(fd6, buf, MAXLINE, 0, (SA*)from, len);

26  printf("%d bytes ICMPv6 from %s:", n, Sock_ntop_host((SA*)from, len));

27  icmp6 = (struct icmp6_hdr*)buf; /* начало заголовка ICMPv6 */

28  if ((icmp6len = n) 8)

29   err_quit("icmp6len (%d) 8", icmp6len);

30  printf(" type = %d, code = %d\n", icmp6-icmp6_type, icmp6-icmp6_code);

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT