Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 129

Автор Уильям БтивСнс

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, ΠΈ ΠΎΠ½ становится Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ.

Π’Ρ‹Π·ΠΎΠ² Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect

14-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 находится Π² процСссС выполнСния), Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΎΠ±ΠΎΠΈΡ… Π½Π°Π±ΠΎΡ€Π°Ρ…, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ дСскрипторы с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ соСдинСниСм, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ сСрвСра, Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π°Π±ΠΎΡ€Π΅ чтСния.