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
приведена
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. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Сама себе хозяйка
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
СД. Том 17
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
Первый пользователь. Книга 3
3. Первый пользователь
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Хочу тебя навсегда
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Адъютант
2. Мания крафта
Фантастика:
фэнтези
6.43
рейтинг книги
Убивать, чтобы жить
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Измена. Испорченная свадьба
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Я – Орк. Том 3
3. Я — Орк
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Крестоносец
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Совок – 3
3. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
7.92
рейтинг книги
С Д. Том 16
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
Назад в СССР: 1986 Книга 5
5. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Ретроградный меркурий
4. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00