14-20 ΠΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΠΏΡΠΎΡΠΎΡΠΈΠΏΡ Π΄Π»Ρ Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π²ΡΠΊΠΎΡΠ΅ ΠΎΠΏΠΈΡΠ΅ΠΌ.
ΠΠΈΡΡΠΈΠ½Π³ 16.9. ΠΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ connect: Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ Π½Π°ΡΠ°Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ main
//nonblock/web.c
1 #include "web.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, fd, n, maxnconn, flags, error;
6 char buf[MAXLINE];
7 fd_set rs, ws;
8 if (argc < 5)
9 err_quit("usage: web <#conns> <hostname> <homepage> <file1> ...");
10 maxnconn = atoi(argv[1]);
11 nfiles = min(argc - 4, MAXFILES);
12 for (i = 0; i < nfiles; i++) {
13 file[i].f_name = argv[i + 4];
14 file[i].f_host = argv[2];
15 file[i].f_flags = 0;
16 }
17 printf("nfiles = %d\n", nfiles);
18 home_page(argv[2], argv[3]);
19 FD_ZERO(&rset);
20 FD_ZERO(&wset);
21 maxfd = -1;
22 nlefttoread = nlefttoconn = nfiles;
23 nconn = 0;
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ11-17 Π‘ΡΡΡΠΊΡΡΡΡ file Π·Π°ΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
Π§ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ°ΡΠ½Π΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΡ18 Π€ΡΠ½ΠΊΡΠΈΡ home_page, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π»ΠΈΡΡΠΈΠ½Π³Π΅, ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ TCP, ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΠΈΡΠ°Π΅Ρ Π΄ΠΎΠΌΠ°ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π΄ΠΎ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ19-23 ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π΄Π²Π° Π½Π°Π±ΠΎΡΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ. maxfd β ΡΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select (ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ -1, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½Ρ), nlefttoread β ΡΠΈΡΠ»ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ (ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ, ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ), nlefttoconn β ΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ², Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠΊΠ° Π΅ΡΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ TCP, a nconn β ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ, ΠΎΡΠΊΡΡΡΡΡ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ (ΠΎΠ½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ).
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 16.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ home_page, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ main.
ΠΠΈΡΡΠΈΠ½Π³ 16.10. Π€ΡΠ½ΠΊΡΠΈΡ home_page
//nonblock/home_page.c
1 #include "web.h"
2 void
3 home_page(const char *host, const char *fname)
4 {
5 int fd, n;
6 char line[MAXLINE];
7 fd = Tcp_connect(host, SERV); /* Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ connect() */
8 n = snprintf(line, sizeof(line), GET_CMD, fname);
9 Writen(fd, line, n);
10 for (;;) {
11 if ((n = Read(fd, line, MAXLINE)) == 0)
12 break; /* ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΠΊΡΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ */
13 printf("read %d bytes of home page\n", n);
14 /* ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ */
15 }
16 printf("end-of-file on home page\n");
17 Close(fd);
18 }
Π£ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ7 ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ tcp_connect ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ HTTP ΡΠ΅ΡΠ²Π΅ΡΡ, ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ°8-17 ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° HTTP GET Π΄Π»Ρ Π΄ΠΎΠΌΠ°ΡΠ½Π΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΡ (ΡΠ°ΡΡΠΎ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ /). Π§ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡΠ²Π΅Ρ (Ρ ΠΎΡΠ²Π΅ΡΠΎΠΌ ΠΌΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ), ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ, start_connect, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 16.11, ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅Ρ Π²ΡΠ·ΠΎΠ² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ connect.
ΠΠΈΡΡΠΈΠ½Π³ 16.11. ΠΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ connect
//nonblock/start_connect.c
1 #include "web.h"
2 void
3 start_connect(struct file *fptr)
4 {
5 int fd, flags, n;
6 struct addrinfo *ai;
7 ai = Host_serv(fptr->f_host, SERV, 0, SOCK_STREAM);
8 fd = Socket(ai->ai_family; ai->ai_socktype, ai->ai_protocol);
9 fptr->f_fd = fd;
10 printf("start_connect for %s, fd %d\n", fptr->f_name, fd);
11 /* ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ° */
12 flags = Fcntl(fd, F_GETFL, 0);
13 Fcntl(fd, F_SETFL, flags | O_NONBLOCK);
14 /* ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅ΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ */
15 if ((n = connected, ai->ai_addr, ai->ai_addrlen)) < 0) {
16 if (errno != EINPROGRESS)
17 err_sys("nonblocking connect error");
18 fptr->f_flags = F_CONNECTING;
19 FD_SET(fd, &rset); /* Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° Π² Π½Π°Π±ΠΎΡΠ΅ ΡΡΠ΅Π½ΠΈΡ
ΠΈ Π·Π°ΠΏΠΈΡΠΈ */
20 FD_SET(fd, &wset);
21 if (fd > maxfd)
22 maxfd = fd;
23 } else if (n >= 0) /* ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ */
24 write_get_cmd(fptr); /* ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ GET ΡΠ΅ΡΠ²Π΅ΡΡ */
25 }
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ°, ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΎΠΊΠ΅ΡΠ°7-13 ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ host_serv Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ·Π»Π° ΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ»ΡΠΆΠ±Ρ. ΠΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΡΠΊΡΡΡ addrinfo. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΡΡΠΊΡΡΡΡ. Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠΊΠ΅Ρ TCP, ΠΈ ΠΎΠ½ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΌ.
ΠΡΠ·ΠΎΠ² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ connect14-22 ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ connect, ΠΈ ΡΠ»Π°Π³Ρ ΡΠ°ΠΉΠ»Π° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ F_CONNECTING. ΠΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ Π² Π½Π°Π±ΠΎΡΠ΅ ΡΡΠ΅Π½ΠΈΡ, ΠΈ Π² Π½Π°Π±ΠΎΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ select Π±ΡΠ΄Π΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΎΡΡ. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ maxfd.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ23-24 ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ connect ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π·Π½Π°ΡΠΈΡ, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ write_get_cmd (ΠΎΠ½Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π»ΠΈΡΡΠΈΠ½Π³Π΅) ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅ΡΠ²Π΅ΡΡ.
ΠΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΌ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ connect, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Π² Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΠΆΠΈΠΌ, Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² ΡΠΎΠΊΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π°Π½Π½ΡΡ (ΠΊΠΎΠΌΠ°Π½Π΄Π° GET ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ) ΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ, ΡΡΠΎ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΠΌΠ΅ΡΡΠ°, ΡΠ΅ΠΌ ΠΈΠΌΠ΅Π΅ΡΡΡ Π² Π±ΡΡΠ΅ΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΈΠ·-Π·Π° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π°Π³Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ write ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ writen ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΡΠ»ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΠΊΠ΅Ρ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΌ, ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ read, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ select Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠΊΠ΅Ρ ΡΡΠ°Π½Π΅Ρ Π³ΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 16.12 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ write_get_cmd, ΠΏΠΎΡΡΠ»Π°ΡΡΠ°Ρ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ HTTP GET.
ΠΠΈΡΡΠΈΠ½Π³ 16.12. ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ HTTP GET ΡΠ΅ΡΠ²Π΅ΡΡ
//nonblock/write_get_cmd.c
1 #include "web.h"
2 void
3 write_get_cmd(struct file *fptr)
4 {
5 int n;
6 char line[MAXLINE];
7 n = snprintf(line, sizeof(line), GET_CMD, fptr->f_name);
8 Writen(fptr->f_fd, line, n);
9 printf("wrote %d bytes for %s\n", n, fptr->f_name);
10 fptr->f_flags = F_READING; /* ΡΠ±ΡΠΎΡ F_CONNECTING */
11 FD_SET(fptr->f_fd, &rset); /* ΠΏΡΠΎΡΠΈΡΠ°Π΅ΠΌ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° */
12 if (fptr->f_fd > maxfd)
13 maxfd = fptr->f_fd;
14 }
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π΅Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠ°7-9 ΠΠΎΠΌΠ°Π½Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΈ ΠΏΠΈΡΠ΅ΡΡΡ Π² ΡΠΎΠΊΠ΅Ρ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»Π°Π³ΠΎΠ²10-13 Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ»Π°Π³ F_READING, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠ»Π°Π³ F_CONNECTING (Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½). ΠΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΡΠΈΠΊΠ»Ρ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π³ΠΎΡΠΎΠ² Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°. Π’Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π² Π½Π°Π±ΠΎΡΠ΅ ΡΡΠ΅Π½ΠΈΡ, ΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ maxfd.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π² ΡΡΠ½ΠΊΡΠΈΡ main, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 16.13, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°, Π³Π΄Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 16.9. ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΊΠ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: ΠΏΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ nlefttoread Π±ΠΎΠ»ΡΡΠ΅ Π½ΡΠ»Ρ), ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΡΡΠ³ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ select Π΄Π»Ρ Π²ΡΠ΅Ρ Π°ΠΊΡΠΈΠ²Π½ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ ΠΊΠ°ΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ .
ΠΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅?24-35 ΠΡΠ»ΠΈ ΠΌΡ Π½Π΅ Π΄ΠΎΡΠ»ΠΈ Π΄ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄Π΅Π»Π° ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΈ Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, ΠΌΡ ΠΈΡΠ΅ΠΌ Π΅ΡΠ΅ Π½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» (Π½Π° Π½Π΅Π³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ f_flags) ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ start_connect Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ. Π§ΠΈΡΠ»ΠΎ Π°ΠΊΡΠΈΠ²Π½ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ (nconn), Π° ΡΠΈΡΠ»ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ (nlefttoconn).
Π€ΡΠ½ΠΊΡΠΈΡ select: ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΠΉ36-37 Π€ΡΠ½ΠΊΡΠΈΡ select ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΡΠΎΠΊΠ΅ΡΠ° Π»ΠΈΠ±ΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, Π»ΠΈΠ±ΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ connect Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ), Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΠΎΠ±ΠΎΠΈΡ Π½Π°Π±ΠΎΡΠ°Ρ , Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² Π½Π°Π±ΠΎΡΠ΅ ΡΡΠ΅Π½ΠΈΡ.