8-22 ΠΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»Π° SIGALRM ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ alarm Π΄Π»Ρ 5-ΡΠ΅ΠΊΡΠ½Π΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom. ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ recvfrom ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ Π½Π°ΡΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°, ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ°Π±ΠΎΡΡ. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΡΡΠΎΠΊΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΌΡ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ alarm ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΡΠ²Π΅Ρ.
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGALRM24-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 }
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select7-10 Π Π½Π°Π±ΠΎΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π±ΠΈΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. Π ΡΡΡΡΠΊΡΡΡΠ΅ timeval ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π²ΡΠ΅ΠΌΡ (ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄), Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π³ΠΎΡΠΎΠ² ΠΆΠ΄Π°ΡΡ.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ select11-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 Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ»Π°Π³Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π· ΡΠΎΠΊΠ΅Ρ.