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

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

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

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 β€” максимально-допустимоС число запросов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

АрхитСктура ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIX (Π›ΠŸ) - pic_112.png

Рисунок 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();

Β  }