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

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

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

36-37 Π€ΡƒΠ½ΠΊΡ†ΠΈΡ select ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ готовности сокСта Π»ΠΈΠ±ΠΎ для чтСния, Π»ΠΈΠ±ΠΎ для записи. ДСскрипторы, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ происходит установлСниС соСдинСния (нСблокируСмая функция connect находится Π² процСссС выполнСния), Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΎΠ±ΠΎΠΈΡ… Π½Π°Π±ΠΎΡ€Π°Ρ…, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ дСскрипторы с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ соСдинСниСм, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ сСрвСра, Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π°Π±ΠΎΡ€Π΅ чтСния.

Листинг 16.13. Основной Ρ†ΠΈΠΊΠ» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main

//nonblock/web.c

24  while (nlefttoread > 0) {

25   while (nconn < maxnconn && nlefttoconn > 0) {

26    /* find a file to read */

27    for (i =0; i < nfiles; i++)

28     if (file[i].f_flags == 0)

29      break;

30    if (i == nfiles)

31     err_quit("nlefttoconn = %d but nothing found", nlefttoconn);

32    start_connect(&file[i]);

33    nconn++;

34    nlefttoconn--;

35   }


36   rs = rset:

37   ws = wset;

38   n = Select(maxfd + 1, &rs, &ws, NULL, NULL);

39   for (i = 0; i < nfiles; i++) {

40    flags = file[i].f_flags;

41    if (flags == 0 || flags & F_DONE)

42     continue;

43    fd = file[i].f_fd;

44    if (flags & F_CONNECTING &&

45     (FD_ISSET(fd, &rs) || FD_ISSET(fd, &ws))) {

46     n = sizeof(error);

47     if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &n) < 0 ||

48      error != 0) {

49      err_ret("nonblocking connect failed

50       for %s", file[i].f_name);

51     }

52     /* соСдинСниС установлСно */

53     printf("connection established for %s\n", file[i].f_name);

54     FD_CLR(fd, &wset); /* ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ запись Π² этот сокСт */

55     write_get_cmd(&file[i]); /* ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ GET */


56    } else if (flags & F_READING && FD_ISSET(fd, &rs)) {

57     if ((n = Read(fd, buf, sizeof(buf))) == 0) {

58      printf("end-of-file on %s\n", file[i].f_name);

59      Close(fd);

60      file[i].f_flags = F_DONE; /* сбрасываСт Ρ„Π»Π°Π³ F_READING */

61      FD_CLR(fd, &rset);

62      nconn--;

63      nlefttoread--;

64     } else {

65      printf("read %d bytes from %s\n", n, file[i].f_name);

66     }

67    }

68   }

69  }

70  exit(0);

71 }

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° всСх Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… дСскрипторов

39-55 Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива структур file, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ дСскрипторы Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ. Если установлСн Ρ„Π»Π°Π³ F_CONNECTING ΠΈ дСскриптор Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π»ΠΈΠ±ΠΎ Π² Π½Π°Π±ΠΎΡ€Π΅ чтСния, Π»ΠΈΠ±ΠΎ Π² Π½Π°Π±ΠΎΡ€Π΅ записи, нСблокируСмая функция connect Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Как ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ описании листинга 16.7, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getsockopt, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ для сокСта. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ошибки Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, соСдинСниС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ. Π’ этом случаС ΠΌΡ‹ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ дСскриптор Π² Π½Π°Π±ΠΎΡ€Π΅ Ρ„Π»Π°Π³ΠΎΠ² записи ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ write_get_cmd для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ запроса HTTP сСрвСру.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ дСскриптора Π΄Π°Π½Π½Ρ‹Π΅

56-67 Π•сли установлСн Ρ„Π»Π°Π³ F_READING ΠΈ дСскриптор Π³ΠΎΡ‚ΠΎΠ² для чтСния, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ read. Если соСдинСниС Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΠ½Ρ†ΠΎΠΌ, ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сокСт, устанавливаСм Ρ„Π»Π°Π³ F_DONE, Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ дСскриптор Π² Π½Π°Π±ΠΎΡ€Π΅ чтСния ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ число Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… соСдинСний ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ число соСдинСний, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π•ΡΡ‚ΡŒ Π΄Π²Π° способа ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π΅Ρ‰Π΅ большС). Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» for Π² листингС 16.13, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ число дСскрипторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΏΠΎ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, Π±Ρ‹Π»ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ, Π³Π΄Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ maxfd, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция select Π½Π΅ провСряла Π±ΠΈΡ‚Ρ‹ дСскрипторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Ρ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ число дСскрипторов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² этом ΠΊΠΎΠ΄Π΅, Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, вСроятно, мСньшС 10, Π° Π½Π΅ порядка тысяч, вряд Π»ΠΈ какая-Π»ΠΈΠ±ΠΎ ΠΈΠ· этих ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ стоит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… услоТнСний.

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСний

Каков Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² эффСктивности ΠΏΡ€ΠΈ установлСнии мноТСства ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСний? Π’ Ρ‚Π°Π±Π». 16.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, которая состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ Π²Π΅Π±-сСрвСра домашнюю страницу ΠΈ Π΄Π΅Π²ΡΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ. ВрСмя обращСния RTT для Π΄Π°Π½Π½ΠΎΠ³ΠΎ соСдинСния с сСрвСром Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 150 мс. Π Π°Π·ΠΌΠ΅Ρ€ домашнСй страницы β€” 4017 Π±Π°ΠΉΡ‚, Π° срСдний Ρ€Π°Π·ΠΌΠ΅Ρ€ дСвяти Ρ„Π°ΠΉΠ»ΠΎΠ² с изобраТСниями составил 1621 Π±Π°ΠΉΡ‚. Π Π°Π·ΠΌΠ΅Ρ€ сСгмСнта TCP Ρ€Π°Π²Π΅Π½ 512 Π±Π°ΠΉΡ‚. Для сравнСния ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ прСдставляСм Π² этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ значСния для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ вСрсии Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ создаСм Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 26.9.


Π’Π°Π±Π»ΠΈΡ†Π° 16.1. ВрСмя выполнСния задания для Ρ€Π°Π·Π½ΠΎΠ³ΠΎ количСства ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСний Π² Ρ€Π°Π·Π½Ρ‹Ρ… вСрсиях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСний Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя (Π² сСкундах), отсутствиС блокирования Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя (Π² сСкундах), использованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² 1 6,0 6,3 2 4,1 4,2 3 3,0 3,1 4 2,8 3,0 5 2,5 2,7 6 2,4 2,5 7 2,3 2,3 8 2,2 2,3 9 2,0 2,3 ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСний, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ слуТит Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ примСнСния Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ примСнСния ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСний ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½Π°. Π­Ρ‚ΠΎ свойство Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² популярном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ β€” Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Netscape. Π’ этой Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Β«ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈΒ», Ссли ΡΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°. Π’ Π³Π»Π°Π²Π΅ 21 [111] ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ TCP, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ старта (slow start) ΠΈ прСдотвращСния ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ сСти (congestion avoidance). Когда ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру устанавливаСтся мноТСство соСдинСний, Ρ‚ΠΎ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ соСдинСниями Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ TCP отсутствуСт. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· соСдинСний происходит потСря ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ соСдинСния с Ρ‚Π΅ΠΌ ΠΆΠ΅ сСрвСром Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ увСдомлСния, ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ соСдинСния вскорС Ρ‚Π°ΠΊΠΆΠ΅ столкнутся с ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΏΠΎΠΊΠ° Π½Π΅ замСдлятся. По этим Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ соСдинСниям Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° слишком большого количСства ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² ΡƒΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ. Π­Ρ‚Π° тСхнология Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° сСрвСр.

МаксимальноС ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ эффСктивности происходит ΠΏΡ€ΠΈ Ρ‚Ρ€Π΅Ρ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСниях (врСмя ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π²Π΄Π²ΠΎΠ΅), Π° ΠΏΡ€ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСниях прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньшС.

16.6. НСблокируСмая функция accept

Как Π±Ρ‹Π»ΠΎ сказано Π² Π³Π»Π°Π²Π΅ 6, функция select сообщаСт, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт Π³ΠΎΡ‚ΠΎΠ² для чтСния, ΠΊΠΎΠ³Π΄Π° установлСнноС соСдинСниС Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ accept. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select для опрСдСлСния готовности входящих соСдинСний, Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° функция select сообщаСт Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ соСдинСниС установлСно, функция accept ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ являСтся Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ.

К соТалСнию, сущСствуСт опрСдСлСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, способная Π·Π°ΠΏΡƒΡ‚Π°Ρ‚ΡŒ нас [34]. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ΄ нашСго эхо- ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° TCP (см. листинг 5.3) Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС установлСния соСдинСния сСрвСру отсылался сСгмСнт RST. Π’ листингС 16.14 прСдставлСна новая вСрсия.

Листинг 16.14. Π­Ρ…ΠΎ-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ TCP, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ соСдинСниС ΠΈ ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΉ сСрвСру сСгмСнт RST

//nonblock/tcpcli03.c

 1 #include "unp.h"


 2 int

 3 main(int argc, char **argv)

 4 {

 5  int sockfd;

 6  struct linger ling;

 7  struct sockaddr_in servaddr;


 8  if (argc != 2)

 9   err_quit("usage: tcpcli <IPaddress>");

10  sockfd = Socket(AF_INET, SOCK_STREAM, 0);


11  bzero(&servaddr, sizeof(servaddr));

12  servaddr.sin_family = AF_INET;

13  servaddr.sin_port = htons(SERV_PORT);

14  Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);


15  Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));