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

12 #ifdef IPV6

13  int hlen2, icmp6len, ret;

14  ssize_t n;

15  socklen_t len;

16  struct ip6_hdr *hip6;

17  struct icmp6_hdr *icmp6;

18  struct udphdr *udp;

19  gotalarm = 0;

20  alarm(3);

21  for (;;) {

22   if (gotalarm)

23    return(-3); /* истек таймер */

24   len = pr-salen;

25   n = recvfrom(recvfd, recvbuf, sizeof(recvbuf), 0, pr-sarecv, len);

26   if (n 0) {

27    if (errno == EINTR)

28     continue;

29    else

30     err_sys("recvfrom error");

31   }

32   icmp6 = (struct icmp6_hdr*)recvbuf; /* ICMP-заголовок */

33   if ((icmp6len = n) 8)

34    continue; /* недостаточно для проверки ICMP-заголовка */

35   if (icmp6-icmp6_type == ICMP6_TIME_EXCEEDED

36    icmp6-icmp6_code == ICMP6_TIME_EXCEED_TRANSIT) {

37    if (icmp6len 8 + sizeof(struct ip6_hdr) + 4)

38     continue; /* недостаточно для проверки внутреннего заголовка */

39    hip6 = (struct ip6_hdr*)(recvbuf + 8);

40    hlen2 = sizeof(struct ip6_hdr);

41    udp = (struct udphdr*)(recvbuf + 8 + hlen2);

42    if (hip6-ip6_nxt == IPPROTO_UDP

43     udp-uh_sport == htons(sport)

44     udp-uh_dport == htons(dport + seq))

45     ret = -2; /* ответил промежуточный маршрутизатор */

46    break;

47   } else if (icmp6-icmp6_type == ICMP6_DST_UNREACH) {

48    if (icmp6len 8 + sizeof(struct ip6_hdr) + 4)

49     continue; /* недостаточно для проверки внутреннего заголовка */

50    hip6 = (struct ip6_hdr*)(recvbuf + 8);

51    hlen2 = sizeof(struct ip6_hdr);

52    udp = (struct udphdr*)(recvbuf + 8 + hlen2);

53    if (hip6-ip6_nxt == IPPROTO_UDP

54     udp-uh_sport == htons(sport)

55     udp-uh_dport == htons(dport + seq)) {

56     if (icmp6-icmp6_code == ICMP6_DST_UNREACH_NOPORT)

57      ret = -1; /* цель достигнута */

58     else

59      ret = icmp6-icmp6_code; /* 0, 1, 2, ... */

60     break;

61    }

62   } else if (verbose) {

63    printf(" (from %s: type = %d, code = %d)\n",

64     Sock_ntop_host(pr-sarecv, pr-salen);

65    icmp6-icmp6_type, icmp6-icmp6_code);

66   }

67   /* другая ICMP-ошибка. нужно вызвать recvfrom */

68  }

69  alarm(0); /* отключаем таймер */

70  Gettimeofday(tv, NULL); /* get time of packet arrival */

71  return(ret);

72 #endif

73 }

Листинг 28.19. Возвращение строки, соответствующей коду недоступности ICMPv6

//traceroute/icmpcode_v6.c

 1 #include "trace.h"

 2 const char *

 3 icmpcode_v6(int code)

 4 {

 5 #ifdef IPV6

 6  static char errbuf[100];

 7  switch (code) {

 8  case ICMP6_DST_UNREACH_NOROUTE:

 9   return("no route to host");

10  case ICMP6_DST_UNREACH_ADMIN:

11   return("administratively prohibited");

12  case ICMP6_DST_UNREACH_NOTNEIGHBOR:

13   return("not a neighbor");

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

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

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

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

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

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

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

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

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