Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:

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);

Вторая часть функции

readable_v6
приведена
в листинге 28.32. Код аналогичен приведенному в листинге 28.30: мы проверяем тип ICMP-ошибки, убеждаемся, что дейтаграмма, вызвавшая ошибку, является UDP-дейтаграммой, а затем строим структуру
icmpd_err
, которую отсылаем клиенту.

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

//icmpd/readable_v6.c

31 if (icmp6->icmp6_type == ICMP6_DST_UNREACH ||

32 icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG ||

33 icmp6->icmp6_type == ICMP6_TIME_EXCEEDED) {

34 if (icmp6len < 8+8)

35 err_quit("icmp6len (%d) < 8 + 8", icmp6len);

36 hip6 = (struct ip6_hdr*)(buf + 8);

37 hlen2 = sizeof(struct ip6_hdr);

38 printf("\tsrcip = %s, dstip = %s, next hdr = %d\n",

39 Inet_ntop(AF_INET6, &hip6->ip6_src, srcstr, sizeof(srcstr)),

40 Inet_ntop(AF_INET6, &hip6->ip6_dst, dststr, sizeof(dststr)),

41 hip6->ip6_nxt);

42 if (hip6->ip6_nxt == IPPROTO_UDP) {

43 udp = (struct udphdr*)(buf + 8 + hlen2);

44 sport = udp->uh_sport;

45 /* поиск доменного сокета клиента, отправка заголовков */

46 for (i = 0; i <= maxi; i++) {

47 if (client[i].connfd >= 0 &&

48 client[i].family == AF_INET6 &&

49 client[i].lport == sport) {

50 bzero(&dest, sizeof(dest));

51 dest.sin6_family = AF_INET6;

52 #ifdef HAVE_SOCKADDR_SA_LEN

53 dest.sin6_len = sizeof(dest);

54 #endif

55 memcpy(&dest.sin6_addr, &hip6->ip6_dst,

56 sizeof(struct in6_addr));

57 dest.sin6_port = udp->uh_dport;

58 icmpd_err.icmpd_type = icmp6->icmp6_type;

59 icmpd_err.icmpd_code = icmp6->icmp6_code;

60 icmpd_err.icmpd_len = sizeof(struct sockaddr_in6);

61 memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));

62 /*
преобразование типа и кода ICMPv6 к значению errno */

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

64 if (icmp6->icmp6_type == ICMP6_DST_UNREACH &&

65 icmp6->icmp6_code ICMP6_DST_UNREACH_NOPORT)

66 icmpd_err.icmpd_errno = ECONNREFUSED;

67 if (icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG)

68 icmpd_err.icmpd_errno = EMSGSIZE;

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

70 }

71 }

72 }

73 }

74 return(--nready);

75 #endif

76 }

28.8. Резюме

Символьные сокеты обеспечивают три возможности:

1. Чтение и запись пакетов ICMPv4, IGMPv4 и ICMPv6.

2. Чтение и запись IP-дейтаграммы с полем протокола, которое не обрабатывается ядром.

3. Формирование своих собственных заголовков IPv4, обычно используемых в диагностических целях (или, к сожалению, хакерами).

Два традиционных диагностических средства — программы

ping
и
traceroute
— используют символьные сокеты. Мы разработали наши собственные версии этих программ, поддерживающие обе версии протокола — и IPv4, и IPv6. Также нами разработан наш собственный демон
icmpd
, который обеспечивает доступ к сообщениям об ошибках ICMP через сокет UDP. Данный пример также иллюстрирует передачу дескриптора через доменный сокет Unix между неродственными клиентом и сервером.

Поделиться:
Популярные книги

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник