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

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

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

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) Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΊΠ°Π·Π°Π» Π½Π°ΠΌ это Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ «срСдство».)