11.8. Π‘Π½Π°ΡΠ°Π»Π° ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ²Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ ΠΈΠΌΡ ΡΠ·Π»Π° ΠΈ ΠΈΠΌΡ ΡΠ»ΡΠΆΠ±Ρ:
char host[NI_MAXHOST], serv[NI_MAXSERV];
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ accept Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ sock_ntop ΡΡΠ½ΠΊΡΠΈΡ getnameinfo:
if (getnameinfo(cliaddr, len, host, NI_MAXHOST, serv, NI_MAXSERV,
NI_NUMERICHOST | NI_NUMERICSERV) == 0)
printf("connection from %s.%s\n", host, serv);
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΠ»Π°Π³ΠΈ NI_NUMERICHOST ΠΈ NI_NUMERICSERV, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΠΎΠΈΡΠΊΠ° Π² DNS ΠΈ /etc/services.
11.9. ΠΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²ΡΠ·Π°ΡΡΡΡ (bind) Ρ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΏΠΎΡΡΠΎΠΌ, ΡΡΠΎ ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠΊΠ΅ΡΠ° SO_REUSEADDR. ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠ΅ΠΉ β ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ udp_server, ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ Π΅Π΅ Π² udp_server_reuseaddr, ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠΊΠ΅ΡΠ°, ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ Π΅Π΅ Π² ΡΠ΅ΡΠ²Π΅ΡΠ΅.
11.10. ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Trying 206.62.226.35..., ΡΡΠ½ΠΊΡΠΈΡ gethostname Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ IP-Π°Π΄ΡΠ΅Ρ. ΠΠ°ΡΠ·Π° ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»Ρ ΠΈΡΠ΅Ρ ΠΈΠΌΡ ΡΠ·Π»Π°. ΠΡΠ²ΠΎΠ΄ Connected to bsdi.unpbook.com. Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ connect Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΠ»Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΠ°ΡΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌΠΈ Π΄Π²ΡΠΌΡ Π²ΡΠ²ΠΎΠ΄Π°ΠΌΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ connect ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
ΠΠ»Π°Π²Π° 12
12.1. ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΡΠΉ Π»ΠΈΡΡΠΈΠ½Π³. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ FTP Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ freebsd Π²ΡΠ΅Π³Π΄Π° ΠΏΡΡΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ EPRT (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π²Π΅ΡΡΠΈΠΈ IP), Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ, ΡΠΎ ΠΎΠ½ ΠΏΡΠΎΠ±ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ PORT.
freebsd % ftp aix-4
Connected to aix-4.unpbook.com.
220 aix FTP server ...
...
230 Guest login ok. access restrictions apply.
ftp> debug
Debugging on (debug=1).
ftp> passive
Passive mode: off; fallback to active mode= off
ftp> dir
---> EPRT |1|192 168.42.1|50484|
500 'EPRT |1|192.168.42.1|50484|' command not understood.
disabling epsv4 for this connection
---> PORT 192.168.42.1.197.52
200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for /bin/ls
...
freebsd % ftp ftp.kame.net
Trying 2001.200:0:4819:203:47ff:fea5:3085...
Connected to orange.kame.net.
220 orange.kame.net FTP server ...
...
230 Guest login ok. access restrictions apply.
ftp> debug
Debugging on (debug=1).
ftp> passive
Passive mode: off; fallback to active mode: off.
ftp> dir
---> EPRT |2|3ffe:b80:3:9ad1::2|50480|
200 EPRT command successful
---> LIST
150 Opening ASCII mode data connection for '/bin/ls'.
ΠΠ»Π°Π²Π° 13
13.1. ΠΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ , Π΄Π°ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ, ΡΠ°ΠΊΠ°Ρ ΠΊΠ°ΠΊ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² ΡΠ°ΠΉΠ»Π°Ρ ΠΆΡΡΠ½Π°Π»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ syslog.
13.2. TCP-Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² echo, discard ΠΈ chargen Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΊΠ°ΠΊ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½ inetd Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ fork, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΡΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΠΏΡΠ΅ΡΠ²Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΠ²Π° Π΄ΡΡΠ³ΠΈΡ TCP-ΡΠ΅ΡΠ²Π΅ΡΠ°, time ΠΈ daytime, Π½Π΅ ΡΡΠ΅Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ fork, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΡΠ»ΡΠΆΠ±Ρ Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ (ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΠΊΡΡΡΡ Π΄Π°ΡΡ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π΅Π΅, Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΈ Π·Π°ΠΊΡΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅). ΠΡΠΈ Π΄Π²Π° ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd. ΠΡΠ΅ ΠΏΡΡΡ UDP-ΡΠ»ΡΠΆΠ± ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ fork, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· Π½ΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π² ΠΎΡΠ²Π΅Ρ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΡΡ ΡΠ»ΡΠΆΠ±Ρ. ΠΡΠΈ ΠΏΡΡΡ ΡΠ»ΡΠΆΠ± ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd.
13.3. ΠΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½Π°Ρ Π°ΡΠ°ΠΊΠ° ΡΠΈΠΏΠ° Β«ΠΎΡΠΊΠ°Π· Π² ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠΈΒ» [18]. ΠΠ΅ΡΠ²Π°Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ° Ρ ΠΏΠΎΡΡΠ° 7 Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅Ρ chargen ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° ΠΏΠΎΡΡ 7. ΠΠ° ΡΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΡ ΠΎ-ΠΎΡΠ²Π΅Ρ, ΠΈ ΡΠ΅ΡΠ²Π΅ΡΡ chargen ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ Π΄ΡΡΠ³Π°Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ°. ΠΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π·Π°ΡΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠ΅. ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ BSD/OS, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ, Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π»ΡΠ±ΠΎΠΌΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ, Π΅ΡΠ»ΠΈ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΏΡΠΈΡΠ΅Π΄ΡΠ΅ΠΉ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ². ΠΡΡΠ³ΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΡΠ»ΡΠΆΠ± β Π»ΠΈΠ±ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΠΌΠΎΠ½Π° inetd Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ·Π»Π΅, Π»ΠΈΠ±ΠΎ Π½Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ΅, ΡΠ²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΡΠ΅ΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΠΌ.
13.4. IP-Π°Π΄ΡΠ΅Ρ ΠΈ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΠΈΠ· ΡΡΡΡΠΊΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ°, Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ accept.
ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄Π΅ΠΌΠΎΠ½ inetd Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎΠ³ΠΎ Π΄Π»Ρ UDP-ΡΠΎΠΊΠ΅ΡΠ°, ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ (recvfrom) ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ exec ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π° Π½Π΅ ΡΠ°ΠΌΠΈΠΌ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd.
ΠΠ΅ΠΌΠΎΠ½ inetd ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈΡΠ°ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Ρ ΡΠ»Π°Π³ΠΎΠΌ MSG_PEEK (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 14.7), ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ IP-Π°Π΄ΡΠ΅Ρ ΠΈ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π½ΠΎ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°ΠΌΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΡ.
ΠΠ»Π°Π²Π° 14
14.1. ΠΡΠ»ΠΈ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΠΏΠ΅ΡΠ²ΡΠΉ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ signal Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SIG_DFL, Π° Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ signal Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠΎΡΡΠΎ Π²Π΅ΡΠ½Π΅Ρ Π΅Π³ΠΎ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
14.3. ΠΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΡΠΈΠΊΠ» for:
for (;;) {
if ((n = Recv(sockfd, recvline, MAXLINE, MSG_PEEK)) == 0)
break; /* ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΠΊΡΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ */
Ioctl(sockfd, FIONREAD, &npend);
printf("%d bytes from PEEK, %d bytes pending\n", n, npend);
n = Read(sockfd, recvline, MAXLINE);
recvline[n] = 0; /* Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ Π½ΡΠ»Ρ */
Fputs(recvline, stdout);
}
14.4. ΠΠ°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΡ ΠΎΠ΄ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ main β ΡΡΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ main Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ Π·Π°ΠΏΡΡΠΊΠ° Π½Π° ΡΠ·ΡΠΊΠ΅ Π‘ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
exit(main(argc, argv));
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ exit, Π° Π·Π°ΡΠ΅ΠΌ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠΈΡΡΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°.
ΠΠ»Π°Π²Π° 15
15.1. Π€ΡΠ½ΠΊΡΠΈΡ unlink ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ·ΠΆΠ΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ connect, ΠΎΠ½Π° Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ. ΠΡΠΎ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠΎΠΊΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½Π΅ ΡΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ connect ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ unlink.
15.2. ΠΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ connect, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ connect Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ ΠΈ ΡΠ²ΡΠ·Π°Π½ Ρ ΡΡΠΈΠΌ ΠΏΠΎΠ»Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 15.4).
15.3. ΠΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π°Π΄ΡΠ΅ΡΠ° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ sock_ntop ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ datagram from (no pathname bound) (Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ° ΠΎΡ (ΠΈΠΌΡ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ)), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π΅ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΡ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Unix Π² ΡΡΠ½ΠΊΡΠΈΡΡ udp_client ΠΈ udp_connect ΠΈ ΡΠ²ΡΠ·Π°ΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ bind Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ. ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½ΠΎ Π½Π΅ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
15.4. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°ΡΡΠ°Π²ΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ Π²Π΅ΡΠ½ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ write 1 Π±Π°ΠΉΡ Π½Π° Π΅Π³ΠΎ 26- Π±Π°ΠΉΡΠΎΠ²ΡΠΉ ΠΎΡΠ²Π΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ sleep Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²ΡΠ΅ 26 ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π΄ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ read, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ read Π²Π΅ΡΠ½Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ. ΠΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ TCP ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π±Π°ΠΉΡΠΎΠ² Ρ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ΠΌ Π³ΡΠ°Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ.
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ Unix, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Ρ Π΄Π²ΡΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ /lΠΎΡΠ°l (ΠΈΠ»ΠΈ /unix) ΠΈ /tmp/daytime (ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ). ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ: 26 Π±Π°ΠΉΡ Π±ΡΠ΄ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ read ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ send ΡΠ΅ΡΠ²Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ»Π°Π³ MSG_EOR, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π°ΠΉΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°ΠΏΠΈΡΡ, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ read ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 1 Π±Π°ΠΉΡ. ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΠ΅ΡΠΊΠ»ΠΈ-ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ»Π°Π³ MSG_EOR ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎΡ ΡΠ°ΠΊΡ Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΡΠ΅ΡΠΈΠΉΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π±Π°ΠΉΡΠΎΠ² ΠΈ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π½Π° Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠΌ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²ΡΠ²ΠΎΠ΄Π° ΠΈΠ΄Π΅Ρ Π² mbuf (Π±ΡΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΠΈ) ΠΈ ΡΠ»Π°Π³ MSG_EOR ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΡΠ΄ΡΠΎΠΌ Π²ΠΌΠ΅ΡΡΠ΅ Ρ mbuf, ΠΊΠΎΠ³Π΄Π° mbuf ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Π² ΠΏΡΠΈΠ΅ΠΌΠ½ΡΠΉ Π±ΡΡΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°. ΠΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ read, ΡΠ»Π°Π³ MSG_EOR Π²ΡΠ΅ Π΅ΡΠ΅ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ mbuf, ΡΠ°ΠΊ ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ΄ΡΠ° read (ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ°Ρ ΡΠ»Π°Π³ MSG_EOR, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠΎΡ ΡΠ»Π°Π³) ΡΠ°ΠΌΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π°ΠΉΡ. ΠΡΠ»ΠΈ Π±Ρ Π²ΠΌΠ΅ΡΡΠΎ read ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ recvmsg, ΡΠ»Π°Π³ MSG_EOR Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»ΡΡ Π±Ρ Π² ΠΏΠΎΠ»Π΅ msg_flags ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° recvmsg Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»Π° Π±Ρ 1 Π±Π°ΠΉΡ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π² TCP Π½Π΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ TCP Π½Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ»Π°Π³ MSG_EOR Π² ΠΎΡΡΡΠ»Π°Π΅ΠΌΠΎΠΌ mbuf ΠΈ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π½Π°Ρ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠΎΡ ΡΠ»Π°Π³ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΌΡ TCP Π² TCP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅. (ΠΡΡΠ°ΠΆΠ°Π΅ΠΌ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡ ΠΠ°ΡΡ Π’ΠΎΠΌΠ°ΡΡ (Matt Thomas) Π·Π° ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠΊΠ°Π·Π°Π» Π½Π°ΠΌ ΡΡΠΎ Π½Π΅Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Β«ΡΡΠ΅Π΄ΡΡΠ²ΠΎΒ».)