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

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

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

36-42 ΠœΡ‹ восстанавливаСм Ρ„Π»Π°Π³ΠΈ, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ статус Ρ„Π°ΠΉΠ»Π°, ΠΈ возвращаСмся. Если наша пСрСмСнная errno ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getsockopt, это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno, ΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1.

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

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ установлСниС соСдинСния ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Ссли ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ записи СдинствСнным ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ установлСниС соСдинСния. Π’ Usenet ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π»ΠΎΡΡŒ мноТСство Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ наш Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getsockopt Π² листингС 16.7:

1. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getpeername вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getsockopt. Если этот Π²Ρ‹Π·ΠΎΠ² окаТСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ ΠΈ возвратится ошибка ENOTCONN, Π·Π½Π°Ρ‡ΠΈΡ‚, соСдинСниС Π½Π΅ Π±Ρ‹Π»ΠΎ установлСно, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для сокСта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getsockopt с SO_ERROR.

2. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ read с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° length. Если Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read окаТСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, функция connect Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, ΠΈ пСрСмСнная errno ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read ΠΏΡ€ΠΈ этом ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ установлСния соСдинСния. Если соСдинСниС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ установлСно, функция read Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»ΡŒ.

3. Π‘Π½ΠΎΠ²Π° Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ connect. Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² окаТСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, ΠΈ Ссли ошибка β€” EISCONN, сокСт ΡƒΠΆΠ΅ присоСдинСн, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ соСдинСниС Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

К соТалСнию, нСблокируСмая функция connect β€” это ΠΎΠ΄Π½Π° ΠΈΠ· самых слоТных областСй сСтСвого программирования с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния пСрСносимости. Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ совмСстимости, особСнно с Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΠΌΠΈ рСализациями. Π‘ΠΎΠ»Π΅Π΅ простой Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ являСтся созданиС ΠΏΠΎΡ‚ΠΎΠΊΠ° (см. Π³Π»Π°Π²Ρƒ 26) для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ соСдинСния.

ΠŸΡ€Π΅Ρ€Π²Π°Π½Π½Π°Ρ функция connect

Π§Ρ‚ΠΎ происходит, Ссли наш Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ сокСтС прСрываСтся, скаТСм, ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ сигналом, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ трСхэтапноС Ρ€ΡƒΠΊΠΎΠΏΠΎΠΆΠ°Ρ‚ΠΈΠ΅ TCP? Если ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция connect Π½Π΅ пСрСзапускаСтся автоматичСски, Ρ‚ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EINTR. Но ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ снова Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ connect, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ установлСния соСдинСния. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС EADDRINUSE.

ВсС, Ρ‡Ρ‚ΠΎ трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² этом сцСнарии, β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select, Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ для Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect. Π’ΠΎΠ³Π΄Π° функция select Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Ссли соСдинСниС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ устанавливаСтся (дСлая сокСт доступным для записи) ΠΈΠ»ΠΈ Ссли ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° соСдинСния Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Π° (сокСт становится доступСн для чтСния ΠΈ для записи).

16.5. НСблокируСмая функция connect: Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ практичСскоС использованиС Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect относится ΠΊ Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Netscape (см. Ρ€Π°Π·Π΄Π΅Π» 13.4 [112]). ΠšΠ»ΠΈΠ΅Π½Ρ‚ устанавливаСт соСдинСниС HTTP с Π²Π΅Π±-сСрвСром ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π° домашнюю страницу. На этой страницС часто ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π΅Π±-страницы. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ страницС Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сразу нСсколько страниц, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect. На рис. 16.5 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ установлСния мноТСства ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСний. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ слСва, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС Ρ‚Ρ€ΠΈ соСдинСния, устанавливаСмыС ΠΎΠ΄Π½ΠΎ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ. ΠœΡ‹ считаСм, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ соСдинСниС Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 10 Π΅Π΄ΠΈΠ½ΠΈΡ† Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” 15, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ β€” 4, Ρ‡Ρ‚ΠΎ Π² суммС Π΄Π°Π΅Ρ‚ 29 Π΅Π΄ΠΈΠ½ΠΈΡ† Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Рис. 16.5. УстановлСниС мноТСства ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСний

Π’ Ρ†Π΅Π½Ρ‚Ρ€Π΅ рисунка ΠΏΠΎΠΊΠ°Π·Π°Π½ сцСнарий, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ выполняСм Π΄Π²Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСния. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ 0 Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° соСдинСния, Π° ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… устанавливаСтся, ΠΌΡ‹ запускаСм Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅. ΠžΠ±Ρ‰Π΅Π΅ врСмя ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ Π²Π΄Π²ΠΎΠ΅ ΠΈ Ρ€Π°Π²Π½ΠΎ 15, Π° Π½Π΅ 29 Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ случай. Если ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ соСдинСния совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΊΠ°Π½Π°Π» связи (допустим, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄Π΅ΠΌ для соСдинСния с Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ΠΎΠΌ), Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· этих соСдинСний ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π·Π° ΠΎΠ±Π»Π°Π΄Π°Π½ΠΈΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ рСсурсами этого ΠΊΠ°Π½Π°Π»Π° связи, ΠΈ врСмя установлСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ соСдинСния ΠΌΠΎΠΆΠ΅Ρ‚ возрасти. НапримСр, врСмя 10 ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠΉΡ‚ΠΈ Π΄ΠΎ 15, 15 β€” Π΄ΠΎ 20, Π° врСмя 4 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² 6. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ врСмя Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 21 Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ всС Ρ€Π°Π²Π½ΠΎ мСньшС, Ρ‡Π΅ΠΌ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ сцСнарии.

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ сцСнарии ΠΌΡ‹ выполняСм Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСния ΠΈ снова считаСм, Ρ‡Ρ‚ΠΎ эти Ρ‚Ρ€ΠΈ соСдинСния Π½Π΅ ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ (ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ случай). Но ΠΎΠ±Ρ‰Π΅Π΅ врСмя ΠΏΡ€ΠΈ этом Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ (15 Π΅Π΄ΠΈΠ½ΠΈΡ†), ΠΊΠ°ΠΊ ΠΈ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ сцСнарии.

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ соСдинСниС устанавливаСтся само ΠΏΠΎ сСбС, Π·Π° Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ соСдинСния ΠΏΠΎ ссылкам, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ соСдинСния. ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ это Π½Π° рис. 16.6.

Рис. 16.6. УстановлСниС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ соСдинСния, Π° Π·Π°Ρ‚Π΅ΠΌ мноТСства ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСний

Для дальнСйшСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ соСдинСнию, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ установлСниС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ соСдинСния Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ соСдинСния, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅ΠΌΡƒ станСт извСстно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ выполняСм нСсколько Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ connect ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ connect_nonb, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² листингС 16.7, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΏΠΎΠΊΠ° соСдинСниС Π½Π΅ установлСно. ВмСсто этого ΠΌΡ‹ отслСТиваСм мноТСство соСдинСний ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считываСт ΠΎΠΊΠΎΠ»ΠΎ 20 строк с Π²Π΅Π±-сСрвСра. ΠœΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки максимальноС число ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСний, имя ΡƒΠ·Π»Π° сСрвСра, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… с сСрвСра. Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ выглядит Ρ‚Π°ΠΊ:

solaris % web % www.foobar.com / image1.gif image2.gif \

 image3.gif image4.gif image5.gif \

 image6.gif image7.gif

АргумСнты ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π·Π°Π΄Π°ΡŽΡ‚ Ρ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… соСдинСния, имя ΡƒΠ·Π»Π° сСрвСра, имя Ρ„Π°ΠΉΠ»Π° домашнСй страницы (/ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ сСрвСра) ΠΈ сСмь Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Ρ„Π°ΠΉΠ»Ρ‹ с изобраТСниями Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ GIF). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π° эти сСмь Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ссылки с домашнСй страницы, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°, Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ домашнюю страницу ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄ HTML. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π·Π±ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄Π° HTML, ΠΌΡ‹ просто Π·Π°Π΄Π°Π΅ΠΌ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

Π­Ρ‚ΠΎ большой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ частями. Π’ листингС 16.8 прСдставлСн наш Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» web.h, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π²ΠΎ всС Ρ„Π°ΠΉΠ»Ρ‹.

Листинг 16.8. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ web.h

//nonblock/web.h

 1 #include "unp.h"


 2 #define MAXFILES 20

 3 #define SERV "80" /* Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° ΠΈΠ»ΠΈ имя слуТбы */


 4 struct file {

 5  char *f_name; /* имя Ρ„Π°ΠΉΠ»Π° */

 6  char *f_host; /* имя ΡƒΠ·Π»Π° ΠΈΠ»ΠΈ адрСс IPv4/IPv6 */

 7  int  f_fd;    /* дСскриптор */

 8  int  f_flags; /* F_xxx ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅ */

 9 } file[MAXFILES];


10 #define F_CONNECTING 1 /* connect() Π² процСссС выполнСния */

11 #define F_READING 2 /* соСдинСниС установлСно; происходит считываниС */

12 #define F_DONE 4 /* всС сдСлано */


13 #define GET_CMD "GET %s HTTP/1.0\r\n\r\n"


14 /* Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ */

15 int nconn, nfiles, nlefttoconn, nlefttoread, maxfd;

16 fd_set rset, wset;


17 /* ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ */

18 void home_page(const char*, const char*);

19 void start_connect (struct file*);

20 void write_get_cmd(struct file*);

Π—Π°Π΄Π°Π½ΠΈΠ΅ структуры file

2-13 ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считываСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство (Π½Π΅ Π±ΠΎΠ»Π΅Π΅ MAXFILES) Ρ„Π°ΠΉΠ»ΠΎΠ² с Π²Π΅Π±-сСрвСра. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° file содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅: Π΅Π³ΠΎ имя (копируСтся ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки), имя ΡƒΠ·Π»Π° ΠΈΠ»ΠΈ IP-адрСс сСрвСра, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ читаСтся Ρ„Π°ΠΉΠ», дСскриптор сокСта, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для этого Ρ„Π°ΠΉΠ»Π°, ΠΈ Π½Π°Π±ΠΎΡ€ Ρ„Π»Π°Π³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ с этим Ρ„Π°ΠΉΠ»ΠΎΠΌ (устанавливаСм соСдинСниС для получСния Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ считываСм Ρ„Π°ΠΉΠ»).

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

14-20 ΠœΡ‹ опрСдСляСм Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ для Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ вскорС опишСм.

Листинг 16.9. ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ connect: Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π½Π°Ρ‡Π°Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main