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

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

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

8-22 ΠœΡ‹ устанавливаСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для сигнала SIGALRM ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ alarm для 5-сСкундного Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom. Если функция recvfrom прСрываСтся нашим ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала, ΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сообщСниС ΠΎΠ± ошибкС ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° строка ΠΎΡ‚ сСрвСра, ΠΌΡ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ alarm ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‚.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала SIGALRM

24-28 ΠΠ°Ρˆ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, прСрывая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvfrom.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ устанавливаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ alarm, ΠΌΡ‹ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π²Π΅Ρ‚. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 20.4 ΠΌΡ‹ попытаСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ мноТСство ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² для Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ alarm, Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ придСтся Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

Π’Π°ΠΉΠΌ-Π°ΡƒΡ‚ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom (функция select)

ΠœΡ‹ дСмонстрируСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ для установки Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° (использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select) Π² листингС 14.3. Π—Π΄Π΅ΡΡŒ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° наша функция readable_timeo, которая ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° дСскриптор станСт Π³ΠΎΡ‚ΠΎΠ² для чтСния, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ числа сСкунд.

Листинг 14.3. Ѐункция readable_timeo: ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° дСскриптор станСт Π³ΠΎΡ‚ΠΎΠ² для чтСния

//lib/readable_timΠ΅ΠΎ.c

 1 #include "unp.h"


 2 int

 3 readable_timeo(int fd, int sec)

 4 {

 5  fd_set rset;

 6  struct timeval tv;


 7  FD_ZERO(&rset);

 8  FD_SET(fd, &rset);


 9  tv.tv_sec = sec;

10  tv.tv_usec = 0;


11  return (select(fd + 1, &rset, NULL, NULL, &tv));

12  /* > Ссли дСскриптор Π³ΠΎΡ‚ΠΎΠ² для чтСния */

13 }

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select

7-10 Π’ Π½Π°Π±ΠΎΡ€Π΅ дСскрипторов для чтСния Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π±ΠΈΡ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΌΡƒ дСскриптору. Π’ структурС timeval устанавливаСтся врСмя (число сСкунд), Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс Π³ΠΎΡ‚ΠΎΠ² ΠΆΠ΄Π°Ρ‚ΡŒ.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select

11-12 Π€ΡƒΠ½ΠΊΡ†ΠΈΡ select ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° дСскриптор станСт Π³ΠΎΡ‚ΠΎΠ² для чтСния ΠΈΠ»ΠΈ истСчСт Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ врСмя оТидания. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select: -1 Π² случаС ошибки, 0, Ссли истСкло врСмя оТидания, ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°ΡŽΡ‰Π΅Π΅ число Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… дСскрипторов, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ появились.

Π­Ρ‚Π° функция Π½Π΅ выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния β€” ΠΎΠ½Π° просто ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° дСскриптор Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ сокСта β€” TCP ΠΈΠ»ΠΈ UDP.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ writable_timeo, Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ. Π­Ρ‚Π° функция ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° дСскриптор Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² для записи.

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² листингС 14.4, Π³Π΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° вСрсия нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dg_cli, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² листингС 8.4. Π­Ρ‚Π° новая вСрсия Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvfrom, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° наша функция readable_timeo Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠœΡ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvfrom, ΠΏΠΎΠΊΠ° функция readable_timeo Π½Π΅ сообщит Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ дСскриптор Π³ΠΎΡ‚ΠΎΠ² для чтСния. Π’Π΅ΠΌ самым ΠΌΡ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ функция recvfrom Π½Π΅ заблокируСтся.

Листинг 14.4. Ѐункция dg_cli, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ readable_timeo для установки Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°

//advio/dgclitimeo1.c

 1 #include "unp.h"


 2 void

 3 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

 4 {

 5  int n;

 6  char sendline[MAXLINE], recvline[MAXLINE + 1];


 7  while (Fgets(sendline, MAXLINE, fp) != NULL) {


 8   Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);


 9   if (Readable_timeo(sockfd, 5) == 0) {

10    fprintf(stderr, "socket timeout\n");

11   } else {

12    n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

13    recvline[n] = 0; /* Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ */

14    Fputs(recvline, stdout);

15   }

16  }

17 }

Π’Π°ΠΉΠΌ-Π°ΡƒΡ‚ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_RCVTIMEO)

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

Листинг 14.5. Ѐункция dg_cli, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_RCVTIMEO для установки Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°

//advio/dgclitimeo2.c

 1 #include "unp.h"


 2 void

 3 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

 4 {

 5  int n;

 6  char sendline[MAXLINE], recvline[MAXLINE + 1];

 7  struct timeval tv;


 8  tv.tv_sec = 5;

 9  tv.tv_usec = 0;

10  Setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));


11  while (Fgets(sendline, MAXLINE, fp) != NULL) {


12    Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);


13    n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

14    if (n < 0) {

15     if (errno == EWOULDBLOCK) {

16     fprintf(stderr, "socket timeout\n");

17     continue;

18    } else

19     err_sys("recvfrom error");

20   }

21   recvline[n] = 0; /* Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ */

22   Fputs(recvline, stdout);

23  }

24 }

Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта

8-10 Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setsockopt β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру timeval, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ записываСтся ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°

15-17 Π•сли Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° истСкаСт, функция (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС recvfrom) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EWOULDBLOCK.

14.3. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ recv ΠΈ send

Π­Ρ‚ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ стандартным функциям read ΠΈ write, Π½ΠΎ для Π½ΠΈΡ… трСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

#include <sys/socket.h>


ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);

ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚: количСство ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ записанных Π±Π°ΠΉΡ‚ΠΎΠ² Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния, -1 Π² случаС ошибки

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ recv ΠΈ send ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с трСмя ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ read ΠΈ write. АргумСнт flags Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ формируСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ логичСского Π˜Π›Π˜ ΠΊ константам, прСдставлСнным Π² Ρ‚Π°Π±Π». 14.1.


Π’Π°Π±Π»ΠΈΡ†Π° 14.1. АргумСнт flags для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°

flags ОписаниС recv send MSG_DONTROUTE He ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ β€’ MSG_DONTWAIT Волько эта опСрация являСтся Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ β€’ β€’ MSG_OOB ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ внСполосных Π΄Π°Π½Π½Ρ‹Ρ… β€’ MSG_PEEK ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ приходящих сообщСний β€’ MSG_WAITALL ОТиданиС всСх Π΄Π°Π½Π½Ρ‹Ρ… β€’

β–  MSG_DONTROUTE. Π­Ρ‚ΠΎΡ‚ Ρ„Π»Π°Π³ сообщаСт ядру, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ находится Π² нашСй сСти, ΠΈ поэтому Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этом свойствС ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΈ описании ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта SO_DONTROUTE (см. Ρ€Π°Π·Π΄Π΅Π» 7.5). Π­Ρ‚ΠΎ свойство ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ для ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° с Ρ„Π»Π°Π³ΠΎΠΌ MSG_DONTROUTE ΠΈΠ»ΠΈ для всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ сокСта, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта.

β–  MSG_DONTWAIT. Π­Ρ‚ΠΎΡ‚ Ρ„Π»Π°Π³ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ опСрация Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° являСтся Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ отсутствия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для сокСта, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ отсутствия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. НСблокируСмый Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΌΡ‹ опишСм Π² Π³Π»Π°Π²Π΅ 15 вмСстС с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π»Π°Π³Π° отсутствия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· сокСт.