ΠΡ Π΅ΡΠ΅ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ str_cli: Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 15.2 ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Π΅Π΅ Π²Π΅ΡΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π° Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 23.3 β Π²Π΅ΡΡΠΈΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΡΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
6.8. ΠΡ ΠΎ-ΡΠ΅ΡΠ²Π΅Ρ TCP (ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅)
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΡΡ ΠΎ-ΡΠ΅ΡΠ²Π΅ΡΡ TCP ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»ΠΎΠ² 5.2 ΠΈ 5.3. ΠΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ select Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fork ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄, Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². ΠΠ° ΡΠΈΡ. 6.11 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
Π ΠΈΡ. 6.11. Π‘Π΅ΡΠ²Π΅Ρ TCP Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
Π£ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π½Π° ΡΠΈΡΡΠ½ΠΊΠ΅ ΡΠΎΡΠΊΠΎΠΉ.
Π‘Π΅ΡΠ²Π΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π±ΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½Π° ΡΠΈΡ. 6.12. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΠΎΠΌ (foreground) ΡΠ΅ΠΆΠΈΠΌΠ΅, Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ 0, 1 ΠΈ 2 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Π²Π²ΠΎΠ΄Π°, Π²ΡΠ²ΠΎΠ΄Π° ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠ΅ΡΠ²ΡΠΌ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π΄Π»Ρ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ 3. ΠΠ°ΡΡΠΈΠ² ΡΠ΅Π»ΡΡ ΡΠΈΡΠ΅Π» client ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ -1.
Π ΠΈΡ. 6.12. Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° TCP Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΌ ΡΠΎΠΊΠ΅ΡΠΎΠΌ
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π½Π΅Π½ΡΠ»Π΅Π²Π°Ρ Π·Π°ΠΏΠΈΡΡ Π² Π½Π°Π±ΠΎΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² β ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π΅Π½ 4.
ΠΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π½Π°ΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ accept. ΠΠΎΠ²ΡΠΉ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ accept, Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π½ΠΎΠΌΠ΅Ρ 4, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ° ΡΠΈΡ. 6.13 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
Π ΠΈΡ. 6.13. Π‘Π΅ΡΠ²Π΅Ρ TCP ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ client, ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Π½Π°Π±ΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ². ΠΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π½Π° ΡΠΈΡ. 6.14.
Π ΠΈΡ. 6.14. Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
Π§Π΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΎΡΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΠΈ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΉ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π½Π° ΡΠΈΡ. 6.15.
Π ΠΈΡ. 6.15. Π‘Π΅ΡΠ²Π΅Ρ TCP ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠΎ Π²ΡΠΎΡΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
ΠΠΎΠ²ΡΠΉ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ (ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ Π½ΠΎΠΌΠ΅Ρ 5) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 6.16.
Π ΠΈΡ. 6.16. Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠΎ Π²ΡΠΎΡΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
ΠΠ°Π»Π΅Π΅ ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. TCP-ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅Π³ΠΌΠ΅Π½Ρ FIN, ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Ρ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½ΠΎΠΌΠ΅Ρ 4 Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² Π³ΠΎΡΠΎΠ²ΡΠΉ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠΎΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ readline Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Ρ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ, ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π°ΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ client[0] ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² -1, Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ 4 Π² Π½Π°Π±ΠΎΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² Π½ΡΠ»Ρ. ΠΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 6.17. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ maxfd Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ.
Π ΠΈΡ. 6.17. Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ°Π·ΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
ΠΡΠ°ΠΊ, ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° client (ΡΠΎ Π΅ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ -1). Π‘Π»Π΅Π΄ΡΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Ρ Π² Π½Π°Π±ΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ maxi β ΡΡΠΎ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ client, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ maxfd (ΠΏΠ»ΡΡ ΠΎΠ΄ΠΈΠ½) β ΡΡΠΎ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ select. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠ· Π΄Π²ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ: FD_SETSIZE ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ΄ΡΠΎΠΌ (ΠΎ ΡΠ΅ΠΌ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»Π° 6.3).
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 6.3. Π‘Π΅ΡΠ²Π΅Ρ TCP, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ select: ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
//tcpcliserv/tcpservselect01.c
1 #include "unp.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, maxi, maxfd, listenfd, connfd, sockfd;
6 int nready, client[FD_SETSIZE],
7 ssize_t n;
8 fd_set rset, allset;
9 char buf[MAXLINE];
10 socklen_t clilen;
11 struct sockaddr_in cliaddr, servaddr;
12 listenfd = Socket(AF_INET, SOCK_STREAM, 0);
13 bzero(&servaddr, sizeof(servaddr));
14 servaddr.sin_family = AF_INET;
15 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
16 servaddr.sin_port = htons(SERV_PORT);
17 Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
18 Listen(listenfd, LISTENQ);
19 maxfd = listenfd; /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ */
20 maxi = -1; /* ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ client[] */
21 for (i = 0; i < FD_SETSIZE; i++)
22 client[i] = -1; /* -1 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ */
23 FD_ZERO(&allset);
24 FD_SET(listenfd, &allset);
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ select12-24 ΠΡΠ°ΠΏΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΡΠ΅ ΠΆΠ΅, ΡΡΠΎ ΠΈ ΡΠ°Π½ΡΡΠ΅: Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ socket, bind ΠΈ listen. ΠΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ ΡΠΎΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ select Π²ΡΠ±Π΅ΡΠ΅ΠΌ, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΌ ΡΠΎΠΊΠ΅ΡΠΎΠΌ.
ΠΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.4.
ΠΠΈΡΡΠΈΠ½Π³ 6.4. Π‘Π΅ΡΠ²Π΅Ρ TCP, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ select: ΡΠΈΠΊΠ»
//tcpcliserv/tcpservselect01.c
25 for (;;) {
26 rset = allset; /* ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΠ΅ */
27 nready = Select(maxfd + 1, &rset, NULL, NULL, NULL);
28 if (FD_ISSET(listenfd, &rset)) { /* ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π½ΠΎΠ²ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ */
29 clilen = sizeof(cliaddr);
30 connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);
31 for (i = 0; i < FD_SETSIZE; i++)
32 if (client[i] < 0) {
33 client[i] = connfd; /* ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ */
34 break;
35 }
36 if (i == FD_SETSIZE)
37 err_quit("too many clients");
38 FD_SET(connfd, &allset); /* Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° */
39 if (connfd > maxfd)
40 maxfd = connfd; /* Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select */
41 if (i > maxi)
42 maxi = i; /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ clientf[] */
43 if (--nready <= 0)
44 continue; /* Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ */
45 }
46 for (i = 0; i <= maxi; i++) { /* ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π²ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅
Π΄Π°Π½Π½ΡΡ */
47 if ((sockfd - client[i]) < 0)
48 continue;
49 if (FD_ISSET(sockfd, &rset)) {
50 if ((n = Read(sockfd, buf, MAXLINE)) == 0) {
51 /* ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΡΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ */
52 Close(sockfd);
53 FD_CLR(sockfd, &allset);
54 client[i] = -1;
55 } else
56 Writen(sockfd, line, n);
57 if (--nready <= 0)
58 break; /* Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ */
59 }
60 }
61 }
62 }
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ select26-27 Π€ΡΠ½ΠΊΡΠΈΡ select ΠΆΠ΄Π΅Ρ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Π½Π΅ ΠΏΡΠΈΠ±ΡΠ΄ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΡΠ΅Π³ΠΌΠ΅Π½Ρ FIN ΠΈΠ»ΠΈ ΡΠ΅Π³ΠΌΠ΅Π½Ρ RST.
ΠΡΠΈΠ½ΡΡΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ accept28-45 ΠΡΠ»ΠΈ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠΎΠΊΠ΅Ρ Π³ΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, Π½ΠΎΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ. ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ accept ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ Π½Π°ΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ Π½Π΅Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° client. Π§ΠΈΡΠ»ΠΎ Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ, ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΊΠ» for. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ select, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π΅ Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ².
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ46-60 ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π»ΠΈ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π² Π½Π°Π±ΠΎΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ select. ΠΡΠ»ΠΈ Π΄Π°, ΡΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΡΡΠΎΠΊΠ°, ΠΏΡΠΈΡΠ»Π°Π½Π½Π°Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ, ΠΈ ΠΎΡΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΡΡΠ½ΠΊΡΠΈΡ read Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Ρ ΠΈ ΠΌΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.