21-25 ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ getsockname, ΡΠ°ΠΊ ΡΡΠΎ Π΄Π΅ΠΌΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠ² ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ°, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ sockaddr_storage, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΊΠ° Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ° Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠΈΠΏΠ° ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½ΡΠΆΠ½ΠΎΠ΅ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅.
26-33 Π‘Π΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ Π°Π΄ΡΠ΅ΡΠΎΠ² ΡΠΎΠΊΠ΅ΡΠ° Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ ΠΏΠΎΡΡΠ° ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π² ΡΡΡΡΠΊΡΡΡΠ΅ client. ΠΡΠ»ΠΈ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sock_bind_wild Π΄Π»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ° ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ° Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅, ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ SVR4.
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΠ± ΡΡΠΏΠ΅Ρ Π΅34 ΠΠ΄ΠΈΠ½ Π±Π°ΠΉΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» "1", ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ.
ΠΠ°ΠΊΡΡΡΠΈΠ΅ UDP-ΡΠΎΠΊΠ΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°35 ΠΠ°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ°Π±ΠΎΡΡ Ρ UDP-ΡΠΎΠΊΠ΅ΡΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ close. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΡΠ»Π°Π½ Π½Π°ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ; ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, UDP-ΡΠΎΠΊΠ΅Ρ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΎΡΠΊΡΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°37-45 ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ. ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π½Π°ΡΠ° ΡΠ°ΡΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Unix Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ ΠΈΠ· Π½Π°Π±ΠΎΡΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select. ΠΠΎΠ»Ρ connfd ΡΡΡΡΠΊΡΡΡΡ client ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ -1, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½Π° Π΅Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅.
Π€ΡΠ½ΠΊΡΠΈΡ readable_v4 Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ICMPv4 ΠΎΡΠΊΡΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. ΠΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.29. ΠΡΠΎΡ ΠΊΠΎΠ΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΠΊΠΎΠ΄Ρ Π΄Π»Ρ ICMPv4, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡ ΡΠ°Π½Π΅Π΅ Π² Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ 28.6 ΠΈ 28.15.
ΠΠΈΡΡΠΈΠ½Π³ 28.29. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ICMPv4, ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ
//icmpd/readable_v4.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 int
7 readable_v4(void)
8 {
9 int i, hlen1, hlen2, icmplen, sport;
10 char buf[MAXLINE];
11 char srcstr[INET_ADDRSTRLEN], dststr[INET_ADDRSTRLEN];
12 ssize_t n;
13 socklen_t len;
14 struct ip *ip, *hip;
15 struct icmp *icmp;
16 struct udphdr *udp;
17 struct sockaddr_in from, dest;
18 struct icmpd_err icmpd_err;
19 len = sizeof(from);
20 n = Recvfrom(fd4, buf, MAXLINE, 0, (SA*)&from, &len);
21 printf("%d bytes ICMPv4 from %s:", n, Sock_ntop_host((SA*)&from, len));
22 ip = (struct ip*)buf; /* Π½Π°ΡΠ°Π»ΠΎ IP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
23 hlen1 = ip->ip_hl << 2; /* Π΄Π»ΠΈΠ½Π° IP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
24 icmp = (struct icmp*)(buf + hlen1); /* Π½Π°ΡΠ°Π»ΠΎ ICMP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
25 if ((icmplen = n - hlen1) < 8)
26 err_quit("icmplen (%d) < 8", icmplen);
27 printf(" type = %d, code = %d\n", icmp->icmp_type, icmp->icmp_code);
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ ICMP. ΠΡΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π΄Π΅ΠΌΠΎΠ½Π°, ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.30 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π²ΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ readable_v4.
ΠΠΈΡΡΠΈΠ½Π³ 28.30. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ICMPv4, Π²ΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ
//icmpd/readable_v4.c
28 if (icmp->icmp_type == ICMP_UNREACH ||
29 icmp->icmp_type ==ICMP_TIMXCEED ||
30 icmp->icmp_type == ICMP_SOURCEQUENCH) {
31 if (icmplen < 8 + 20 + 8)
32 err_quit("icmplen (%d) < 8 + 20 + 8, icmplen);
33 hip = (struct ip*)(buf + hlen1 + 8);
34 hlen2 = hip->ip_hl << 2;
35 printf("\tsrcip = %s, dstip = %s, proto = %d\n",
36 Inet_ntop(AF_INET, &hip->ip_src, srcstr, sizeof(srcstr)),
37 Inet_ntop(AF_INET, &hip->ip_dst, dststr, sizeof(dststr)),
38 hip->ip_p);
39 if (hip->ip_p == IPPROTO_UDP) {
40 udp = (struct udphdr*)(buf + hlen1 + 8 + hlen2);
41 sport = udp->uh_sport;
42 /* ΠΏΠΎΠΈΡΠΊ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
43 for (i = 0; i <= maxi; i++) {
44 if (client[i].connfd >= 0 &&
45 client[i].family == AF_INET &&
46 client[i].lport == sport) {
47 bzero(&dest, sizeof(dest));
48 dest.sin_family = AF_INET;
49 #ifdef HAVE_SOCKADDR_SA_LEN
50 dest.sin_len = sizeof(dest);
51 #endif
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_err56-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);
ΠΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ 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 &&