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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PerlΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 49

Автор ΠœΠΈΡ…Π°ΠΈΠ» Π¨ΠΎΡ…ΠΈΡ€Π΅Π²

Для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… Π² сСти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… сСтСвых устройств, ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… хостами (host), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… чисСл - IP-адрСса: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 192.168.82.83 ΠΈΠ»ΠΈ 172.16.2.73. НазначСнный IP-адрСс слуТит ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ хоста Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ сСти. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ хост, настроСнный Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ IP ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊ сСти, ΠΈΠΌΠ΅Π΅Ρ‚ собствСнный ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс 127.0.0.1 - Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ мСстоимСния "я" Π½Π° языкС сСтСвых ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΉ. Π₯ост ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ IP-адрСсу, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, имя хоста www.perl.com соотвСтствуСт адрСсу 208.201.239.36. БобствСнному адрСсу 127.0.0.1 соотвСтствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ имя localhost. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ хостС ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ нСсколько сСтСвых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ‚ΠΎ для распрСдСлСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΈ отправляСмых ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числовыС обозначСния, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ программная Ρ‚ΠΎΡ‡ΠΊΠ° отправлСния ΠΈΠ»ΠΈ доставки Π΄Π°Π½Π½Ρ‹Ρ… Π² IP-сСтях опрСдСляСтся сочСтаниСм адрСса ΠΈ ΠΏΠΎΡ€Ρ‚Π°, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ. МногиС Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΏΠΎ общСпринятым соглашСниям Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Ρ‹ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ сСтСвыми слуТбами. НапримСр, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ web-сСрвСру Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ машинС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ адрСсу ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ 127.0.0.1:80, Π° ΠΊ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌΡƒ сСрвСру - ΠΏΠΎ 127.0.0.1:25.

Для установлСния соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ хостами ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² IP-сСтях примСняСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сокСтов. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ (socket) ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ логичСскиС ΠΊΠ°Π½Π°Π»Ρ‹ двустороннСй связи ΠΌΠ΅ΠΆΠ΄Ρƒ сСтСвыми ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ. Π‘ΠΎΠΊΠ΅Ρ‚ опрСдСляСтся адрСсом хоста, Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΡ€Ρ‚Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ пСрСсылки Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ примСняСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² транспортного уровня - UDP ΠΈΠ»ΠΈ TCP, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IP. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP (User Datagram Protocol) примСняСтся для ΠΎΠ±ΠΌΠ΅Π½Π° нСзависимыми Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ (datagram), Π±Π΅Π· ΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ доставки адрСсату. НапримСр, с использованиСм ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° UDP ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ запросы управлСния устройствами ΠΈΠ»ΠΈ пСрСсылаСтся Π°ΡƒΠ΄ΠΈΠΎ- ΠΈΠ»ΠΈ видСотрансляция, ΠΊΠΎΠ³Π΄Π° потСря Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π΅ слишком сущСствСнна. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP (Transmission Control Protocol) примСняСтся для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ сСти ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ этом контролируСтся гарантированная доставка упорядочСнной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² адрСсату. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° TCP, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, отправляСтся элСктронная ΠΏΠΎΡ‡Ρ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ web-страницы.

Π”Π°ΠΆΠ΅ Ссли Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΏΡ€ΠΈ сСтСвом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° Perl ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ высокоуровнСвыС срСдства, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ хотя Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Π±Π΅Π³Π»ΠΎ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· сокСты. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Perl, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅ΠΉ Π΅Π³ΠΎ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ, стало Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ сСтСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ встроСны Π² ядро языка, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: socket, socketpair, getsockname, getpeername, setsockopt, bind, listen, accept, send, recv, shutdown. Но Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартными модулями, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ срСдства Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сокСтами. Π’ стандартном ΠΌΠΎΠ΄ΡƒΠ»Π΅ Socket ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сокСтами. НапримСр, функция inet_ntoa() ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π² строку Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС IP-адрСса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ встроСнная функция gethostbyname. А функция inet_aton() ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строковоС прСдставлСниС адрСса Π² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ для встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gethostbyaddr, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя хоста ΠΏΠΎ IP-адрСсу. Π Π°Π±ΠΎΡ‚Ρƒ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:


use Socket; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сокСтами my $host_name = 'www.perl.com'; # ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ хоста my $address = gethostbyname($host_name); # ΡƒΠ·Π½Π°Π΅ΠΌ адрСс ΠΈ my $ip_address = inet_ntoa($address); # ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ print "$ip_address $host_name\n"; # Π² строку # Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: 208.201.239.36 www.perl.com $address = inet_aton($ip_address); # ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ my $host_name = gethostbyaddr($address,AF_INET);# ΡƒΠ·Π½Π°Π΅ΠΌ имя print "$ip_address $host_name\n"; # ΠΏΠΎ адрСсу # Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: 208.201.239.36 www.perl.com


Класс IO::Socket прСдоставляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ интСрфСйс для встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ трудностями ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ошибок ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· сокСты. Максимально ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт написаниС сСрвСра для ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP:


use IO::Socket; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сокСтами my $server_port = 5555; # ΠΏΠΎΡ€Ρ‚ для ΠΎΠ±ΠΌΠ΅Π½Π° my $server = IO::Socket::INET->new( # создаСм сокСт LocalPort => $server_port, # Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ Type => SOCK_STREAM, # для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° Proto => 'tcp', # ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP Listen => 10, # с 10-ю соСдинСниями Reuse => 1) # or die "Ошибка запуска TCP сСрвСра Π½Π° $server_port ( [email protected])"; while (my $client = $server->accept()) { # создаСм ΠΏΠΎΡ‚ΠΎΠΊ для $client->autoflush(1); # ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€, my $message = <$client>; # Ρ‡ΠΈΡ‚Π°Π΅ΠΌ сообщСниС ΠΈΠ· Π½Π΅Π³ΠΎ print $client "OK\n"; # посылаСм ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ close $client; # ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ print STDERR $message; # Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сообщСниС last if $message =~ /STOP/i; # Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, Ссли } # Π² сообщСнии Π΅ΡΡ‚ΡŒ STOP, close $server; # ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сокСт


Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎ сСти, Π½ΠΎ ΠΈ для мСТпроцСссного взаимодСйствия, ΠΊΠΎΠ³Π΄Π° сСрвСр ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Для доступа ΠΊ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ сСрвСру ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:


use IO::Socket; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сокСтами my $server_host = '127.0.0.1'; # адрСс сСрвСра my $server_port = 5555; # ΠΈ ΠΏΠΎΡ€Ρ‚ Π½Π° Π½Π΅ΠΌ my $socket = IO::Socket::INET->new( # создаСм сокСт Type => SOCK_STREAM, # для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° Proto => 'tcp', # ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP PeerAddr => $server_host, # с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ адрСсом PeerPort => $server_port) # ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠΌ or die "Ошибка соСдинСния с $remote_host:$remote_port ( [email protected])"; # сообщСниС задаСтся my $message = $ARGV[0] || # ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° связи!"; # ΠΈΠ»ΠΈ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΠ΅ΠΌ print $socket "$message\n"; # отправляСм Π΅Π³ΠΎ ΠΈ my $answer = <$socket>; # ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ print "$answer"; # Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‚ close $socket; # ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сокСт


Из этого Π½Π΅Π·Π°Ρ‚Π΅ΠΉΠ»ΠΈΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄: для согласованной Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ установлСнным "ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ общСния" Π²ΠΎ врСмя сСанса ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ уровня. Π’ нашСм случаС ΠΏΡ€Π°Π²ΠΈΠ»Π° сводятся ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΠΌΠ΅Π½ ΠΈΠ΄Π΅Ρ‚ ΠΏΠΎ ΠΏΠΎΡ€Ρ‚Ρƒ 5555, сСрвСр ΠΆΠ΄Π΅Ρ‚ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ сообщСниС, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΆΠ΄Π΅Ρ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ сСрвСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится строка 'STOP'. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ соглашСния ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ… сСтСвого ΠΎΠ±ΠΌΠ΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: HTTP (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° гипСртСкстовых Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²), SMTP (ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹), FTP (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„Π°ΠΉΠ»ΠΎΠ²). ОписаниС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… соглашСний ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ RFC (Request For Comment) - фактичСских ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Ρ… стандартов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сСтСвого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

Π’ΠΎ ВсСмирной сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ насчитываСтся ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… сСрвСров, Π³Π΄Π΅ хранятся Π°Ρ€Ρ…ΠΈΠ²Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, докумСнтация ΠΈ другая информация. FTP (File Transfer Protocol) - это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ созданный для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². ОбмСн Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ остаСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· постоянных Π·Π°Π΄Π°Ρ‡ сСтСвого программирования, которая Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ срСдствами языка Perl. Π’ поставкС Perl имССтся стандартный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Net::FTP, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ FTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт вСсьма просто ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ с сСрвСром ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ FTP - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ автоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² с сСрвСра. Π”Π°Π»Π΅Π΅ приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ FTP Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ с сСрвСра Ρ„Π°ΠΉΠ», Ссли ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ врСмя измСнСния, Ρ‡Π΅ΠΌ Π΅Π³ΠΎ локальная копия:


use Net::FTP; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с FTP my $server = 'ftp.server.org'; # имя ΠΈΠ»ΠΈ адрСс сСрвСра my $file = 'file.name'; # имя Ρ„Π°ΠΉΠ»Π° my $ftp = Net::FTP->new($server) # соСдиняСмся с сСрвСром or die "Ошибка соСдинСния с $server: [email protected]"; $ftp->login('ftp','ftp') # ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ имя ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ or die " Ошибка рСгистрации:", $ftp->message; $ftp->cwd("/pub") # ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ or die "Ошибка смСны ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°:", $ftp->message; my $time_ftp = $ftp->mdtm($file) # врСмя измСнСния Π½Π° сСрвСрС or die; my $time_old = (stat($file))[9]; # врСмя создания ΠΊΠΎΠΏΠΈΠΈ if ($time_ftp > $time_old) { # Ссли Ρ„Π°ΠΉΠ» Π½Π° сСрвСрС Π½ΠΎΠ²Π΅Π΅, $ftp->binary; # Ρ‚ΠΎ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ $ftp->get($file) # Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Ρ„Π°ΠΉΠ» or die "Ошибка Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ: ", $ftp->message; utime($time_ftp, $time_ftp, $file); # ΠΈ мСняСм врСмя Ρ„Π°ΠΉΠ»Π° } $ftp->quit; # Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ сСанс связи


ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² классС Net::FTP Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° FTP, с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π°. ΠšΡ€ΠΎΠΌΠ΅ этого класса, Π² Π°Ρ€Ρ…ΠΈΠ²Π°Ρ… CPAN ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для ΠΎΠ±ΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ с FTP-сСрвСрами.

ЭлСктронная ΠΏΠΎΡ‡Ρ‚Π° (e-mail) Π±Ρ‹Π»Π° ΠΈ остаСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых популярных сСтСвых сСрвисов. ЭлСктронная ΠΏΠΎΡ‡Ρ‚Π° базируСтся Π½Π° асинхронной доставкС ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ сообщСния (message) с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ сСрвСра Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° SMTP (Simple Mail Transfer Protocol). ΠŸΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ сообщСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ хранятся Π½Π° сСрвСрС Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌ ящикС (mail-box). ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ почтовая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° (Mail User Agent, MUA) Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚Ρƒ с сСрвСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· вСрсий ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° POP (Post-Office Protocol) ΠΈΠ»ΠΈ прСдоставляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ нСпосрСдствСнный доступ ΠΊ ящику Π½Π° ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌ сСрвСрС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IMAP (Internet Mail Access Protocol).