3. Π§ΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΎΠΊΠ΅Ρ UDP, ΡΠ²ΡΠΆΠ΅ΠΌ ΠΏΠΎΡΡ 7 Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΡ ΠΎ-ΡΠ΅ΡΠ²Π΅Ρ Π² ΡΠ°Π±Π». 2.1) ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΠΌ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP-ΡΠ΅ΡΠ²Π΅ΡΡ chargen?
4. Π ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ Solaris 2.x Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½Π° inetd ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠ»Π°Π³ -t, Π·Π°ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π΄Π΅ΠΌΠΎΠ½ inetd Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ syslog (Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ facility=LOG_DAEMON ΠΈ level=LOG_NOTICE) Π΄Π»Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ IP-Π°Π΄ΡΠ΅ΡΠ° ΠΈ ΠΏΠΎΡΡΠ° Π»ΡΠ±ΠΎΠΉ ΡΠ»ΡΠΆΠ±Ρ TCP, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π΄Π΅ΠΌΠΎΠ½ inetd. ΠΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½ inetd ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ?
Π ΡΡΠΎΠΌ ΠΆΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ Π΄Π΅ΠΌΠΎΠ½ inetd Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΎ Π΄Π»Ρ ΡΠΎΠΊΠ΅ΡΠ° UDP. ΠΠΎΡΠ΅ΠΌΡ?
ΠΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ»ΡΠΆΠ± UDP?
ΠΠ»Π°Π²Π° 14
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°
14.1. ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠ° Π³Π»Π°Π²Π° ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π² ΠΎΠ±ΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Β«ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°Β». Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ΅ΠΌΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ ΡΡΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΉ read ΠΈ write: recv ΠΈ send, Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠ»Π°Π³ΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊ ΡΠ΄ΡΡ; readv ΠΈ writev, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Π½Π°ΠΌ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² Π±ΡΡΠ΅ΡΠΎΠ² Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π²ΡΠ²ΠΎΠ΄Π°; recvmsg ΠΈ sendmsg, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡΠΈΠ΅ Π²ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π‘, ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ.
14.2. Π’Π°ΠΉΠΌ-Π°ΡΡΡ ΡΠΎΠΊΠ΅ΡΠ°
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠΈ ΡΠΏΠΎΡΠΎΠ±Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π· ΡΠΎΠΊΠ΅Ρ.
1. ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ alarm, ΠΊΠΎΡΠΎΡΠ°Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π» SIGALRM, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΡΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π²Π°ΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊ Π΄ΡΡΠ³ΠΎΠΉ. Π ΡΠΎΠΌΡ ΠΆΠ΅ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΠΏΠΎΠΌΠ΅Ρ ΠΎΠΉ Π΄ΡΡΠ³ΠΈΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ Π²ΡΠ·ΠΎΠ²Π°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ alarm Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅.
2. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π² ΡΡΠ½ΠΊΡΠΈΠΈ select, ΠΈΠΌΠ΅ΡΡΠ΅ΠΉ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π²ΠΌΠ΅ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ read ΠΈΠ»ΠΈ write.
3. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΎΠΊΠ΅ΡΠ° β SO_RCVTIMEO ΠΈ SO_SNDTIMEO. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π΅ Π²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ².
ΠΡΠ΅ ΡΡΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π²Π²ΠΎΠ΄Π° ΠΈ Π²ΡΠ²ΠΎΠ΄Π° (ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ read, write ΠΈ ΠΈΡ Π²Π°ΡΠΈΠ°ΡΠΈΡΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ recvfrom ΠΈ sendto), Π½ΠΎ Π½Π°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ connect, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ TCP ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ (ΠΎΠ±ΡΡΠ½ΠΎ 75 Ρ). Π€ΡΠ½ΠΊΡΠΈΡ select ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ connect, ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠΎΠΊΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ (ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 16.3), Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ², ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΠΈΠ΅ ΡΠ°ΠΉΠΌ-Π°ΡΡ, Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ connect. ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΠ΅ΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°ΠΌΠΈ ΡΠΎΠΊΠ΅ΡΠΎΠ².
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ΅Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ.
Π’Π°ΠΉΠΌ-Π°ΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ connect (ΡΠΈΠ³Π½Π°Π» SIGALRM)
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 14.1[1] ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ connect_timeo, Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ connect Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. ΠΠ΅ΡΠ²ΡΠ΅ ΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° β ΡΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ connect, Π° ΡΠ΅ΡΠ²Π΅ΡΡΡΠΉ β ΡΡΠΎ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ .
ΠΠΈΡΡΠΈΠ½Π³ 14.1. Π€ΡΠ½ΠΊΡΠΈΡ connect Ρ ΡΠ°ΠΉΠΌ-Π°ΡΡΠΎΠΌ
//lib/connect_timeo.c
1 #include "unp.h"
2 static void connect_alarm(int);
3 int
4 connect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec)
5 {
6 Sigfunc *sigfunc;
7 int n;
8 sigfunc = Signal(SIGALRM, connect_alarm);
9 if (alarm(nsec) != 0)
10 err_msg("connect_timeo: alarm was already set");
11 if ((n = connect(sockfd, saptr, salen)) < 0) {
12 close(sockfd);
13 if (errno == EINTR)
14 errno = ETIMEDOUT;
15 }
16 alarm(0); /* ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ alarm */
17 Signal(SIGALRM, sigfunc); /* Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ
ΡΠΈΠ³Π½Π°Π»Π° */
18 return (n);
19 }
20 static void
21 connect_alarm(int signo)
22 {
23 return; /* ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌ connect() */
24 }
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ²8 ΠΠ»Ρ SIGALRM ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π°. Π’Π΅ΠΊΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ ΠΈΠΌΠ΅Π΅ΡΡΡ) ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ, ΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠΌΠ΅ΡΠ°9-10 Π’Π°ΠΉΠΌΠ΅Ρ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π²ΡΠ΅ΠΌΡ (ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄), Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ alarm β ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄, ΠΎΡΡΠ°ΡΡΠΈΡ ΡΡ Π² ΡΠ°ΠΉΠΌΠ΅ΡΠ΅ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° (Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°) Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ 0 (Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠΌΠ΅Ρ Π½Π΅ Π±ΡΠ» ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΏΡΠ΅ΠΆΠ΄Π΅). Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΡΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ° (ΡΠΌ. ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 14.2).
ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ connect11-15 ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ connect, ΠΈ Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ (EINTR), ΠΌΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ETIMEDOUT. Π‘ΠΎΠΊΠ΅Ρ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡ ΡΡΠ΅Ρ ΡΡΠ°ΠΏΠ½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΡ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°16-18 Π’Π°ΠΉΠΌΠ΅Ρ ΠΏΡΠΈ ΠΎΠ±Π½ΡΠ»Π΅Π½ΠΈΠΈ Π²ΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΈ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ ΠΈΠΌΠ΅Π΅ΡΡΡ).
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° SIGALRM20-24 ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠ΅ΡΠ²Π΅Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ connect, Π·Π°ΡΡΠ°Π²ΠΈΠ² Π΅Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ EINTR. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ signal (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 5.5), ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π°Π³Π° SA_RESTART, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌΡΠΉ ΡΠΈΠ³Π½Π°Π» β ΡΡΠΎ ΡΠΈΠ³Π½Π°Π» SIGALRM.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°ΠΆΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΌΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ connect, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, Π½ΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄, Π·Π°Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ ΡΠ΄ΡΠ°. Π ΠΠ΅ΡΠΊΠ»ΠΈ-ΡΠ΄ΡΠ΅ ΡΠ°ΠΉΠΌ-Π°ΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ connect ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π²Π΅Π½ 75 Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ ΠΌΠ΅Π½ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π΄ΠΎΠΏΡΡΡΠΈΠΌ 10, Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°Π΄Π°Π΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΊΠ°ΠΆΠ΅ΠΌ 80, ΡΠ°ΠΉΠΌ- Π°ΡΡ ΡΠ°ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ connect Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΡΠΎΡΡΠ°Π²ΠΈΡ 75 Ρ.
ΠΡΡΠ³ΠΎΠΉ Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ β ΡΠΎ, ΡΡΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° (connect) Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΈΡΡΠ΅ΡΠ΅Ρ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠ΄ΡΠ°. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ EINTR. ΠΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 29.7 ΠΌΡ Π²ΡΡΡΠ΅ΡΠΈΠΌΡΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ², ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ EINTR. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ SIGALRM ΠΈ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π½ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.6 ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π½Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ sigsetjmp ΠΈ siglongjmp, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΡ EINTR.
Π’Π°ΠΉΠΌ-Π°ΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom (ΡΠΈΠ³Π½Π°Π» SIGALRM)
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 14.2 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ dg_cli, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.4, Π² ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ alarm Π΄Π»Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΎΡΠ²Π΅ΡΠ° Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ 5 Ρ.
ΠΠΈΡΡΠΈΠ½Π³ 14.2. Π€ΡΠ½ΠΊΡΠΈΡ dg_cli, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ alarm
//advio/dgclitimeo3.c
1 #include "unp.h"
2 static void signalrm(int);
3 void
4 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
5 {
6 int n;
7 char sendline[MAXLINE], recvline[MAXLINE + 1];
8 Signal(SIGALRM, signalrm);
9 while (Fgets(sendline, MAXLINE, fp) != NULL) {
10 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
11 alarm(5);
12 if ((n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {
13 if (errno == EINTR)
14 fprintf(stderr, "socket timeout\n");
15 else
16 err_sys("recvfrom error");
17 } else {
18 alarm(0);
19 recvline[n] = 0; /* Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ Π½ΡΠ»Ρ */
20 Fputs(recvline, stdout);
21 }
22 }
23 }
24 static void
25 sig_alrm(int signo)
26 {
27 return; /* ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌ recvfrom() */
28 }
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom8-22 ΠΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»Π° SIGALRM ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ alarm Π΄Π»Ρ 5-ΡΠ΅ΠΊΡΠ½Π΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom. ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ recvfrom ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ Π½Π°ΡΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°, ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ°Π±ΠΎΡΡ. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΡΡΠΎΠΊΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΌΡ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ alarm ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΡΠ²Π΅Ρ.