Читаем 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");

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

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

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

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

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

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

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT