Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.24 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main.
ΠΠΈΡΡΠΈΠ½Π³ 28.24. ΠΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠΎΠ²
//icmpd/icmpd.c
1 #include "icmpd.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, sockfd;
6 struct sockaddr_un sun;
7 if (argc != 1)
8 err_quit("usage: icmpd");
9 maxi = -1; /* ΠΈΠ½Π΄Π΅ΠΊΡ ΠΌΠ°ΡΡΠΈΠ²Π° client[] */
10 for (i = 0; i < FD_SETSIZE; i++)
11 client[i].connfd = -1; /* -1 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ */
12 FD_ZERO(&allset);
13 fd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
14 FD_SET(fd4, &allset);
15 maxfd = fd4;
16 #ifdef IPV6
17 fd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
18 FD_SET(fd6, &allset);
19 maxfd = max(maxfd, fd6);
20 #endif
21 listenfd = Socket(AF_UNIX, SOCK_STREAM, 0);
22 sun.sun_family = AF_LOCAL;
23 strcpy(sun.sun_path, ICMPD_PATH);
24 unlink(ICMPD_PATH);
25 Bind(listenfd, (SA*)&sun, sizeof(sun));
26 Listen(listenfd, LISTENQ);
27 FD_SET(listenfd, &allset);
28 maxfd = max(maxfd, listenfd);
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° client9-10 ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² client ΠΏΡΡΠ΅ΠΌ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ -1 ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠΎΠ²12-28 Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ ΡΡΠΈ ΡΠΎΠΊΠ΅ΡΠ°: ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ICMPv4, ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ICMPv6 ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix. ΠΡ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ bind ΡΠ²ΠΎΠ΅ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ listen. ΠΡΠΎ ΡΠΎΠΊΠ΅Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ connect. ΠΠ»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select ΡΠ°ΠΊΠΆΠ΅ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π° Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ accept Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ°.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.25 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π²ΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main. ΠΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ», Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ select Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ² ΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π΅ΠΌΠΎΠ½Π°.
ΠΠΈΡΡΠΈΠ½Π³ 28.25. ΠΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main: ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π³ΠΎΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊ ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°
//icmpd/icmpd.c
29 for (;;) {
30 rset = allset;
31 nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
32 if (FD_ISSET(listenfd, &rset))
33 if (readable_listen() <= 0)
34 continue;
35 if (FD_ISSET(fd4, &rset))
36 if (readable_v4() <= 0)
37 continue;
38 #ifdef IPV6
39 if (FD_ISSET(fd6, &rset))
40 if (readable_v6() <= 0)
41 continue;
42 #endif
43 for (i = 0; i <= maxi; i++) { /* ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π²ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² */
44 if ( (sockfd = client[i].connfd) < 0)
45 continue;
46 if (FD_ISSET(sockfd, &rset))
47 if (readable_conn(i) <= 0)
48 break; /* Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ */
49 }
50 }
51 exit(0);
52 }
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Unix32-34 ΠΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π³ΠΎΡΠΎΠ², Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ readable_listen. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ nready β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΡ select Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΊ ΡΡΠ΅Π½ΠΈΡ β ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ. ΠΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ readablΠ΅_XXX ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° 1, ΠΈ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΠ³Π΄Π° Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ Π½ΡΠ»Ρ, ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠ΅ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΊ ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Ρ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ select Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ½ΠΎΠ²Π°.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² ICMP35-42 ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ICMPv4, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ICMPv6.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Unix43-49 ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ, Π³ΠΎΡΠΎΠ² Π»ΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Unix. ΠΠΎΡΠΎΠ²Π½ΠΎΡΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΎΡΠ»Π°Π» Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.26 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ readable_listen, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠΎΠΊΠ΅Ρ Π³ΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. ΠΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
ΠΠΈΡΡΠΈΠ½Π³ 28.26. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
//icmpd/readablΠ΅_listen.c
1 #include "icmpd.h"
2 int
3 readable_listen(void)
4 {
5 int i, connfd;
6 socklen_t clilen;
7 clilen = sizeof(cliaddr);
8 connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);
9 /* ΠΏΠΎΠΈΡΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ client[] */
10 for (i = 0; i < FD_SETSIZE; i++)
11 if (client[i].connfd < 0) {
12 client[i].connfd = connfd; /* ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° */
13 break;
14 }
15 if (i == FD_SETSIZE) {
16 close(connfd); /* Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ */
17 return(--nready); /* Π³ΡΡΠ±ΠΎΠ΅ Π·Π°ΠΊΡΡΡΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ */
18 }
19 printf("new connection, i = %d, connfd = %d\n", i, connfd);
20 FD_SET(connfd, &allset); /* Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π² Π½Π°Π±ΠΎΡ */
21 if (connfd > maxfd)
22 maxfd = connfd; /* Π΄Π»Ρ select() */
23 if (i > maxi)
24 maxi = i; /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ client[] */
25 return(--nready);
26 }
7-25 ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° client. ΠΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ ΠΈΠ· Π½Π°ΡΠ°Π»Π° ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.4. ΠΡΠ»ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π½Π΅Ρ, ΠΌΡ Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ².
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Π³ΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ readablΠ΅_conn (Π»ΠΈΡΡΠΈΠ½Π³ 28.27), Π° Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ client.
ΠΠΈΡΡΠΈΠ½Π³ 28.27. Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
//icmpd/readable_conn.c
1 #include "icmpd.h"
2 int
3 readable_conn(int I)
4 {
5 int unixfd, recvfd;
6 char c;
7 ssize_t n;
8 socklen_t len;
9 struct sockaddr_storage ss;
10 unixfd = client[i].connfd;
11 recvfd = -1;
12 if ((n = Read_fd(unixfd, &c, 1, &recvfd)) == 0) {
13 err_msg("client %d terminated, recvfd = %d", i, recvfd);
14 goto clientdone; /* Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ°Π±ΠΎΡΡ */
15 }
16 /* Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ */
17 if (recvfd < 0) {
18 err_msg("read_fd did not return descriptor");
19 goto clienterr;
20 }
Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°13-18 ΠΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ read_fd, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.9, Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. ΠΡΠ»ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ, ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΡΡΠ» ΡΠ²ΠΎΡ ΡΠ°ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π·Π°Π²Π΅ΡΡΠΈΠ² ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΡΠ»ΠΎΡΡ Π²ΡΠ±ΠΈΡΠ°ΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ β Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix, Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° UDP ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΡΠ΅ΡΠ΅Π· Π»ΡΠ±ΠΎΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΎΡΠ΄Π°Π½ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΌΡ ΡΠΎΠΊΠ΅ΡΡ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΊΡΡΠ²Π°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° client. ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΎΠΊΠ΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ, ΡΠΎ Π½Π΅ ΡΠ·Π½Π°Π»ΠΈ Π±Ρ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ°Π±ΠΎΡΡ.
16-20 ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π·Π°ΠΊΡΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΠΆΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. ΠΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ readable_conn ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.28.
ΠΠΈΡΡΠΈΠ½Π³ 28.28. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΠΏΠΎΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ²ΡΠ·Π°Π» Ρ UDP-ΡΠΎΠΊΠ΅ΡΠΎΠΌ
//icmpd/readable_conn.c
21 len = sizeof(ss);
22 if (getsockname(recvfd, (SA*)&ss, &len) < 0) {
23 err_ret("getsockname error");
24 goto clienterr;
25 }
26 client[i].family = ss.ss_family;
27 if ((client[i].lport = sock_get_port((SA*)&ss, len)) == 0) {
28 client[i].lport = sock_bind_wild(recvfd, client[i].family);
29 if (client[i].lport <= 0) {
30 err_ret("error binding ephemeral port");
31 goto clienterr;
32 }
33 }
34 Write(unixfd, "1", 1); /* ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΠ± ΡΡΠΏΠ΅Ρ Π΅ */
35 Close(recvfd); /* ΡΠ°Π±ΠΎΡΠ° Ρ UDP-ΡΠΎΠΊΠ΅ΡΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π° */
36 return(--nready);
37 clienterr:
38 Write(unixfd, "0", 1); /* ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ */
39 clientdone:
40 Close(unixfd);
41 if (recvfd >= 0)
42 Close(recvfd);
43 FD_CLR(unixfd, &allset);
44 client[i].connfd = -1;
45 return(--nready);
46 }
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΠΏΠΎΡΡΠ°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ UDP21-25 ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ getsockname, ΡΠ°ΠΊ ΡΡΠΎ Π΄Π΅ΠΌΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠ² ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ°, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ sockaddr_storage, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΊΠ° Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ° Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠΈΠΏΠ° ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½ΡΠΆΠ½ΠΎΠ΅ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅.