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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «АрхитСктура ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 108

Автор ΠœΠΎΡ€ΠΈΡ Π‘Π°Ρ…

Π“Π½Π΅Π·Π΄Π°, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ свойствами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΠΈΡ€Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° ΠΎΠ±Ρ‰ΠΈΠ΅ соглашСния ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ адрСсов (Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ…), Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π΄ΠΎΠΌΠ΅Π½Ρ‹ (управляСмыС ΠΎΠ΄Π½ΠΈΠΌ ΡƒΠ·Π»ΠΎΠΌ). Π’ систСмС BSD 4.2 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠΌΠ΅Π½Ρ‹: "UNIX system" β€” для взаимодСйствия процСссов Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ "Internet" (мСТсСтСвой) β€” для взаимодСйствия Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° DARPA (Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрспСктивных исслСдований ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ ΠœΠΈΠ½ΠΈΡΡ‚Π΅Ρ€ΡΡ‚Π²Π° ΠΎΠ±ΠΎΡ€ΠΎΠ½Ρ‹ БША) (см. [Postel 80] ΠΈ [Postel 81]). Π“Π½Π΅Π·Π΄Π° Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²: Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» (ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ Π³Π½Π΅Π·Π΄ΠΎ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Π‘Π΅Ρ€ΠΊΠ»ΠΈ) ΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ… с сохранСниСм исходной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π”Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ доставку с сохранСниСм ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ ΠΎΠ½ΠΈ Π±ΠΎΠ»Π΅Π΅ экономны Π² смыслС использования рСсурсов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для Π½ΠΈΡ… Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ слоТныС установочныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаях взаимодСйствия. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ допустимой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠΌΠ΅Π½-Π³Π½Π΅Π·Π΄ΠΎ Π² систСмС поддСрТиваСтся ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π΄ΠΎΠΌΠ΅Π½Π° "Internet" услуги Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° выполняСт ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» транспортной связи (TCP), Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» (UDP).

БущСствуСт нСсколько систСмных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Π½Π΅Π·Π΄Π°ΠΌΠΈ. Ѐункция socket устанавливаСт ΠΎΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π»ΠΈΠ½ΠΈΠΈ связи.


sd = socket(format, type, protocol);


Format ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½ ("UNIX system" ΠΈΠ»ΠΈ "Internet"), type β€” Ρ‚ΠΈΠΏ связи Ρ‡Π΅Ρ€Π΅Π· Π³Π½Π΅Π·Π΄ΠΎ (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈΠ»ΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°), Π° protocol β€” Ρ‚ΠΈΠΏ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ взаимодСйствиСм. ДСскриптор Π³Π½Π΅Π·Π΄Π° sd, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ socket, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ систСмными функциями. Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π³Π½Π΅Π·Π΄ выполняСт функция close.

Ѐункция bind связываСт дСскриптор Π³Π½Π΅Π·Π΄Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ:


bind(sd, address, length);


Π³Π΄Π΅ sd β€” дСскриптор Π³Π½Π΅Π·Π΄Π°, address β€” адрСс структуры, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹ΠΉ для Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ socket). Length β€” Π΄Π»ΠΈΠ½Π° структуры address; Π±Π΅Π· этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ядро Π½Π΅ Π·Π½Π°Π»ΠΎ Π±Ρ‹, ΠΊΠ°ΠΊΠΎΠ²Π° Π΄Π»ΠΈΠ½Π° структуры, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ. НапримСр, для Π΄ΠΎΠΌΠ΅Π½Π° "UNIX system" структура содСрТит имя Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹-сСрвСры ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ Π³Π½Π΅Π·Π΄Π° с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ ΠΎ ΡΠΎΡΡ‚ΠΎΡΠ²ΡˆΠ΅ΠΌΡΡ присвоСнии ΠΈΠΌΠ΅Π½ процСссам-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect дСлаСтся запрос Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π³Π½Π΅Π·Π΄Ρƒ:


connect(sd, address, length);


БСмантичСский смысл ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ остаСтся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ (см. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bind), Π½ΠΎ address ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΆΠ΅ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π³Π½Π΅Π·Π΄ΠΎ, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Π΅Ρ† Π»ΠΈΠ½ΠΈΠΈ связи. Оба Π³Π½Π΅Π·Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄ΠΎΠΌΠ΅Π½ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» связи, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ядро удостовСрит ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ установки Π»ΠΈΠ½ΠΈΠΈ связи. Если Ρ‚ΠΈΠΏ Π³Π½Π΅Π·Π΄Π° β€” Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°, сообщаСмый Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ connect ядру адрСс Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… обращСниях ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ send Ρ‡Π΅Ρ€Π΅Π· Π΄Π°Π½Π½ΠΎΠ΅ Π³Π½Π΅Π·Π΄ΠΎ; Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Π½ΠΈΠΊΠ°ΠΊΠΈΡ… соСдинСний Π½Π΅ производится.

Пока процСсс-сСрвСр готовится ΠΊ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ связи ΠΏΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ, ядру слСдуСт Π²Ρ‹ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ запросы Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° обслуТиваниС. Максимальная Π΄Π»ΠΈΠ½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ задаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ listen:


listen(sd, qlength)


Π³Π΄Π΅ sd β€” дСскриптор Π³Π½Π΅Π·Π΄Π°, Π° qlength β€” максимально-допустимоС число запросов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Рисунок 11.19. ΠŸΡ€ΠΈΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° сСрвСром

БистСмная функция accept ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ запросы Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ Π½Π° Π²Ρ…ΠΎΠ΄ процСсса-сСрвСра:


nsd = accept(sd, address, addrlen);


Π³Π΄Π΅ sd β€” дСскриптор Π³Π½Π΅Π·Π΄Π°, address β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ массив, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ядро Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ адрСс ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, addrlen β€” Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ массива. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ядро записываСт Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ addrlen Ρ€Π°Π·ΠΌΠ΅Ρ€ пространства, фактичСски занятого массивом. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ дСскриптор Π³Π½Π΅Π·Π΄Π° (nsd), ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ дСскриптора sd. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ слСТСниС Π·Π° состояниСм объявлСнного Π³Π½Π΅Π·Π΄Π°, поддСрТивая связь с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ (Рисунок 11.19).

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ send ΠΈ recv Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π³Π½Π΅Π·Π΄ΠΎ. Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ send:


count = send(sd, msg, length, flags);


Π³Π΄Π΅ sd β€” дСскриптор Π³Π½Π΅Π·Π΄Π°, msg β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° посылаСмыС Π΄Π°Π½Π½Ρ‹Π΅, length Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ…, count β€” количСство фактичСски ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ flags ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SOF_OOB (ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ out-of-band β€” "Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π°ΠΌΠΎΠΆΠ½ΡŽ"), Ссли посылаСмыС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ процСссами. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ рСгистрации, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ out-of-band сообщСниС, ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° клавиши "delete". Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recv:


count = recv(sd, buf, length, flags);


Π³Π΄Π΅ buf β€” массив для ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ…, length β€” ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ объСм Π΄Π°Π½Π½Ρ‹Ρ…, count количСство Π±Π°ΠΉΡ‚, фактичСски ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π€Π»Π°Π³ΠΈ (flags) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅Π΅ сообщСниС послС чтСния ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΅Π³ΠΎ содСрТимого Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΈΠ»ΠΈ настроСны Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… out-of-band. Π’ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… вСрсиях ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, sendto ΠΈ recvfrom, Π² качСствС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ адрСса. ПослС выполнСния ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π³Π½Π΅Π·Π΄Π°ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° процСссы ΠΌΠΎΠ³ΡƒΡ‚ вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ send ΠΈ recv ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read ΠΈ write. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, согласовав Ρ‚ΠΈΠΏ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, сСрвСры ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ процСссы, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с функциями read ΠΈ write, словно ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»ΠΎ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ.

Ѐункция shutdown Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π³Π½Π΅Π·Π΄ΠΎΠ²ΡƒΡŽ связь:


shutdown(sd, mode)


Π³Π΄Π΅ mode ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· сторон (ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‰Π΅ΠΉ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ ΠΈΠ»ΠΈ ΠΎΠ±Π΅ΠΈΠΌ вмСстС) ΠΎΡ‚Π½Ρ‹Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ участиС Π² процСссС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Ѐункция сообщаСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ сСанса сСтСвого взаимодСйствия, оставляя, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, дСскрипторы Π³Π½Π΅Π·Π΄ Π² нСприкосновСнности. ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ΡΡ дСскриптор Π³Π½Π΅Π·Π΄Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ close.

БистСмная функция getsockname ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ имя Π³Π½Π΅Π·Π΄ΠΎΠ²ΠΎΠΉ связи, установлСнной Ρ€Π°Π½Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind:


getsockname(sd, name, length);


Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ getsockopt ΠΈ setsockopt ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ значСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… связанных с Π³Π½Π΅Π·Π΄ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² соотвСтствии с Ρ‚ΠΈΠΏΠΎΠΌ Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

Рассмотрим ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π½Π° РисункС 11.20. ΠŸΡ€ΠΎΡ†Π΅ΡΡ создаСт Π² Π΄ΠΎΠΌΠ΅Π½Π΅ "UNIX system" Π³Π½Π΅Π·Π΄ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ присваиваСт Π΅ΠΌΡƒ имя sockname. Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ listen устанавливаСтся Π΄Π»ΠΈΠ½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… сообщСний ΠΈ начинаСтся Ρ†ΠΈΠΊΠ» оТидания поступлСния запросов. Ѐункция accept приостанавливаСт своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ зарСгистрирован запрос Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π³Π½Π΅Π·Π΄Ρƒ с ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ; послС этого функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, возвращая ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅ΠΌΡƒ запросу Π½ΠΎΠ²Ρ‹ΠΉ дСскриптор Π³Π½Π΅Π·Π΄Π°. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-сСрвСр ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ связь с процСссом-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ; Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΡ€ΠΈ этом Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ свои дСскрипторы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΠΌΠ΅Ρ…ΠΎΠΉ для ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ‚Ρ€Π°Ρ„Ρ„ΠΈΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π²Π΅Π΄Π΅Ρ‚ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-сСрвСр возвращаСтся ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ Ρ†ΠΈΠΊΠ»Π° ΠΈ ΠΆΠ΄Π΅Ρ‚ поступлСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ запроса Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.


#include β€Ήsys/types.hβ€Ί

#include β€Ήsys/socket.hβ€Ί

main() {

 int sd, ns;

 char buf[256];

 struct sockaddr sockaddr;

 int fromlen;

 sd = socket(AF_UNIX, SOCK_STREAM, 0);

 /* имя Π³Π½Π΅Π·Π΄Π° β€” Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ пустой символ */

 bind(sd, "sockname", sizeof("sockname") - 1);

 listen(sd, 1);

 for (;;) {

  ns = accept(sd, &sockaddr, &fromlen);

  if (fork() == 0) { /* ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ */

   close(sd);

   read(ns, buf, sizeof(buf));

   printf("сСрвСр Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ %s'\n",buf);

   exit();

  }

  close(ns);

 }

}

Рисунок 11.20. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-сСрвСр Π² Π΄ΠΎΠΌΠ΅Π½Π΅ "UNIX system"

#include β€Ήsys/types.hβ€Ί

#include β€Ήsys/socket.hβ€Ί

main() {

 int sd, ns;

 char buf[256];

 struct sockaddr sockaddr;

 int fromlen;

 sd = socket(AF_UNIX, SOCK_STREAM, 0);

 /* имя Π² запросС Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡƒΡΡ‚ΠΎΠΉ символ */

 if (connect(sd, "sockname", sizeof("sockname") - 1) == -1) exit();

 write(sd, "hi guy", 6);}

Рисунок 11.21. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π² Π΄ΠΎΠΌΠ΅Π½Π΅ "UNIX system"

На РисункС 11.21 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ процСсса-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с сСрвСром. ΠšΠ»ΠΈΠ΅Π½Ρ‚ создаСт Π³Π½Π΅Π·Π΄ΠΎ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π΄ΠΎΠΌΠ΅Π½Π΅, Ρ‡Ρ‚ΠΎ ΠΈ сСрвСр, ΠΈ посылаСт запрос Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π³Π½Π΅Π·Π΄Ρƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ sockname. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ процСсс-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» связи с сСрвСром. Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ сообщСниС ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Если сСрвСр обслуТиваСт процСссы Π² сСти, ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π³Π½Π΅Π·Π΄ΠΎ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π΄ΠΎΠΌΠ΅Π½Ρƒ "Internet", ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


socket(AF_INET, SOCK_STREAM, 0);