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

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

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

20-24 ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π² массивС client для ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ сокСта ΠΈ присваиваСм дСскрипторам для ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов -1. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π΅ΠΌ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ poll событиС POLLRDNORM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ maxi содСрТит ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс массива client, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Вторая Ρ‡Π°ΡΡ‚ΡŒ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 6.6.

Листинг 6.6. Вторая Ρ‡Π°ΡΡ‚ΡŒ сСрвСра TCP, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ poll

//tcpcliserv/tcpservpoll01.c

25  for (;;) {

26   nready = Poll(client, maxi + 1, INFTIM);


27   if (client[0].revents & POLLRDNORM) { /* Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС

                                              с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ */

28    clilen = sizeof(cliaddr);

29    connfd = Accept(listenfd. (SA*)&cliaddr, &clilen);


30    for (i = 1; i < OPEN_MAX; i++)

31     if (client[1].fd < 0) {

32      client[i].fd = connfd; /* сохраняСм дСскриптор */

33      break;

34     }

35    if (i == OPEN_MAX)

36     err_quit("too many clients");


37    client[i].events = POLLRDNORM;

38    if (i > maxi)

39     maxi = i; /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс Π² массивС client[] */


40    if (--nready <= 0)

41     continue; /* большС Π½Π΅Ρ‚ дСскрипторов, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… для чтСния */

42   }

43   for (i = 1; i <= maxi; i++) { /* провСряСм всС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅

                                      Π΄Π°Π½Π½Ρ‹Ρ… */

44    if ((sockfd = client[i].fd) < 0)

45     continue;

46    if (client[i].revents & (POLLRDNORM | POLLERR)) {

47     if ((n = Read(sockfd, buf, MAXLINE)) < 0) {

48      if (errno == ECONNRESET) {

49       /* соСдинСниС пСрСустановлСно ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ */

50       Close(sockfd);

51       client[i].fd = -1;

52      } else

53       err_sys("readline error");

54     } else if (n == 0) {

55      /* соСдинСниС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ */

56      Close(sockfd);

57      client[i].fd = -1;

58     } else

59      Writen(sockfd, line, n);


60     if (--nready <= 0)

61      break; /* большС Π½Π΅Ρ‚ дСскрипторов, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… для чтСния */

62    }

63   }

64  }

65 }

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ poll, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ соСдинСния

26-42 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ poll для оТидания Π½ΠΎΠ²ΠΎΠ³ΠΎ соСдинСния Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ соСдинСнии. Когда Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС принято, ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ свободный элСмСнт Π² массивС client β€” это ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ дСскриптором. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ поиск с индСкса 1, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнт client[0] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ сокСта. Когда свободный элСмСнт Π½Π°ΠΉΠ΄Π΅Π½, ΠΌΡ‹ сохраняСм дСскриптор ΠΈ устанавливаСм событиС POLLRDNORM.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ соСдинСнии

43-63 Π”Π²Π° события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚, β€” это POLLRDNORM ΠΈ POLLERR. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π»Π°Π³ Π² элСмСнтС event ΠΌΡ‹ Π½Π΅ устанавливали, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот Ρ„Π»Π°Π³ возвращаСтся всСгда, Ссли ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ условиС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ провСряСм событиС POLLERR, Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ это событиС, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ сСгмСнт RST, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΆΠ΅ Π² Ρ‚Π°ΠΊΠΎΠΉ ситуации Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ событиС POLLRDNORM. Π’ любом случаС ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ read, ΠΈ Ссли ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка, эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΅Π΅. Когда ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ соСдинСниС Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΌΡ‹ просто присваиваСм элСмСнту fd Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1.

6.12. РСзюмС

Π’ Unix сущСствуСт ΠΏΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°:

β–  Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄;

β–  Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄;

β–  ΠΌΡƒΠ»ΡŒΡ‚иплСксированиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°;

β–  ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΉ сигналом Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄;

β–  Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄, ΠΈ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ встрСчаСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто. НСблокируСмый Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈ управляСмый сигналом Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΌΡ‹ рассмотрим Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ…. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрСли ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Асинхронный Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ опрСдСляСтся Π² стандартС POSIX, Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ.

НаиболСС часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°- Π²Ρ‹Π²ΠΎΠ΄Π° являСтся функция select. ΠœΡ‹ сообщаСм этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ дСскрипторы нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ (для чтСния, записи ΠΈΠ»ΠΈ условия ошибки), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅ΠΉ максимальноС врСмя оТидания ΠΈ максимальноС число дСскрипторов (ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ). Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ количСство дСскрипторов, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… для чтСния, ΠΈ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, СдинствСнноС условиС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с сокСтами β€” это ΠΏΡ€ΠΈΠ±Ρ‹Ρ‚ΠΈΠ΅ внСполосных Π΄Π°Π½Π½Ρ‹Ρ… (см. Π³Π»Π°Π²Ρƒ 21). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция select позволяСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ врСмя блокирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ это свойство Π² листингС 14.3 для ограничСния ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, ΠΌΡ‹ выяснили, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, Π΄Π°Π½Π½Ρ‹Π΅ всС Π΅Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°Π½Π°Π»Π΅ Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ сСрвСру ΠΈΠ»ΠΈ ΠΎΡ‚ сСрвСра. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° этого сцСнария Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shutdown, которая позволяСт Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ свойством TCP, ΠΊΠ°ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π½ΠΎΠ³ΠΎ закрытия соСдинСния (half-close feature).

POSIX опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pselect (ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° с микросСкунд Π΄ΠΎ наносСкунд) ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся Π½ΠΎΠ²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Π±ΠΎΡ€ сигналов. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ситуации Π³ΠΎΠ½ΠΎΠΊ (race condition) ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сигналов, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 20.5.

Ѐункция poll ΠΈΠ· System V прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½Π° обСспСчиваСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌΠΈ устройствами. POSIX Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ poll, Π½ΠΎ пСрвая распространСна ΡˆΠΈΡ€Π΅.

УпраТнСния

1. ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ дСскрипторов ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ дСскрипторов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания языка Π‘. Как это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π½Π°Π±ΠΎΡ€ дСскрипторов являСтся массивом Ρ†Π΅Π»Ρ‹Ρ… чисСл? (Подсказка: посмотритС Π½Π° свой систСмный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <sys/select.h> ΠΈΠ»ΠΈ <sys/types.h>.)

2. ΠžΠΏΠΈΡΡ‹Π²Π°Ρ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 6.3 условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция select сообщаСт, Ρ‡Ρ‚ΠΎ дСскриптор Π³ΠΎΡ‚ΠΎΠ² для записи, ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ сокСт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ опСрация записи Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠ»Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

3. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈΠ· листинга 6.1, Ссли ΠΌΡ‹ поставим слово else ΠΏΠ΅Ρ€Π΅Π΄ if Π² строкС 19?

4. Π’ листингС 6.3 Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСрвСру ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ максимальноС число дСскрипторов, допустимоС ядром (Подсказка: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setrlimit.)

5. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ происходит, Ссли Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shutdown пСрСдаСтся SHUT_RD. Π’ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ Π·Π° основу ΠΊΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° TCP, прСдставлСнный Π² листингС 5.3, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния: вмСсто Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚Π° SERV_PORT Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΠΏΠΎΡ€Ρ‚ 19 (слуТба chargen, см. Ρ‚Π°Π±Π». 2.1), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_cli Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pause. ЗапуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π·Π°Π΄Π°Π² IP-адрСс локального ΡƒΠ·Π»Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся сСрвСр chargen. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, tcpdump (см. Ρ€Π°Π·Π΄Π΅Π» Π’.5). Π§Ρ‚ΠΎ происходит?

6. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ shutdown с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ SHUT_RDWR, вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ close?

7. Π§Ρ‚ΠΎ происходит Π² листингС 6.4, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ отправляСт RST для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ соСдинСния?

8. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² листингС 6.5, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sysconf для опрСдСлСния максимального числа дСскрипторов ΠΈ размСщСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ массива client Π² памяти.

Π“Π»Π°Π²Π° 7

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сокСтов

7.1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы получСния ΠΈ установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сокСтов:

β–  Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getsockopt ΠΈ setsockopt;

β–  Ρ„ункция fcntl;

β–  Ρ„ункция ioctl.

Π­Ρ‚Ρƒ Π³Π»Π°Π²Ρƒ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ getsockopt ΠΈ setsockopt. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выводятся Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС всСх ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сокСтов. ΠœΡ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ»ΠΈ описаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ: ΠΎΠ±Ρ‰ΠΈΠ΅, IPv4, IPv6, TCP ΠΈ SCTP. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΈ Π³Π»Π°Π²Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΏΡ€ΠΈ нСобходимости ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Ρ‹ ссылки. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… Π³Π»Π°Π²Π°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv4 ΠΈ IPv6 ΠΌΡ‹ обсуТдаСм Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 19.5.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fcntl, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ прСдусмотрСнныС стандартом POSIX возмоТности ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ для сокСта Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сигналами, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° сокСта. Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ ioctl ΠΌΡ‹ опишСм Π² Π³Π»Π°Π²Π΅ 17.