| Содержание | Предисловие | В |
Приложение BСетевые клиентыНемногие компьютеры (и, соответственно, работающие на них пользователи) остаются в изоляции от остального компьютерного мира. Сети, когда-то бывшие достоянием в основном государственных У всех этих приложений есть одна общая черта: они работают на основе TCP, фундаментального протокола, который обеспечивает взаимодействие между собой всех сетей, входящих в<Как же с помощью сети позволить приложению, работающему на одной машине, общаться с другим приложением, которое может функционировать на совершенно другой машине? Средствами Perl* На самом деле коммуникации в Internet обеспечиваются протоколом IP (Internet Protocol)Даже если вы еще ни разу не работали в компьютерной сети, вы уже знаете о системе с установлением соединений: это — телефонная сетЗвоня кому-то по телефону, вы выступаете в роли клиента. Тот, кто поднимает трубку на другом конце линии, является сервером. Программисты, имеющие опыт работы на С, возможно, знакомы с гнездами (sockets) . Гнездо — это интерфейс к сетиВы можете читать данные из гнезда, записывать в него данные, а также выполнять обе эти операции. Это объясняется тем, что гнездо — особый вид двунаправленного дескриптора фаДавайте выжмем еще немного из нашей телефонной модели. Звоня на коммутатор большой компании, вы можете попросить соединить вас с конкретным отделом по названию (например, с отделом кадров) или
* Почти так же; поиск по гнезду невозможен.Хотя гнезда изначально разрабатывались для Berkeley UNIX, все возрастающая популярность InternetПодробное рассмотрение TCP/IP выходит за рамки нашей книги, но мы можем представить хотя бы несколько простых клиентов. О сервПростой клиент Для нашего простейшего клиента мы выберем довольно скучный сервис, который называется daytime ("время суток"). Сервер времВот клиент: #!/usr/bin/peri -w use 10::Socket; $remote = 10::Socket::INET->new( Proto => "tcp", PeerAddr => "localhost", PeerPort => "daytime(13)", ) or die "cannot connect to daytime port at localhost"; while ( <$remote> ) ( print ) Запустив эту программу, вы должны получить с сервера примерно следующее: Thu May 8 11:57:15 1997 * IO::Socket входит в состав стандартного дистрибутива Perl версии 5.004.Вот что означают параметры конструктора new:Proto Протокол, который следует использовать. В данном случае возвращенный дескриптор гнезда будет подключен к TCP-гнезду, потому что нам нужно потоковое соединение, т.е. соединение, которое работает PeerAddr Имя или Internet-адрес удаленного хоста, на котором работает сервер. Мы могли бы указать имя подлиннее, например www.perl.com, илиPeerPort Имя или номер порта сервиса, с которым мы хотим соединиться. В системах с нормально конфигурированным системным файлом серви-сов* мы могли бы обойтись просто именем daytime,Вы обратили внимание на то, как возвращаемое значение конструктора new используется в роли дескриптора файла в цикле while?так — все остальные строки:@lines = <$handle>; а так — послать в него строку данных:print $handle "some data\n"; * Системный файл сервисов в UNIX находится в каталоге /etc/services.Клиент webgetВот простой клиент, который устанавливает соединение с удаленным сервером и получает с него список документов. Этот клиент интереснее предыдущего, потому что перед получением ответа сер #!/usr/bin/peri -w use 10::Socket; unless (@ARGV > 1) ( die "usage: $0 host document ..." } $host = shift (OARGV); foreach $document ( OARGV ) ( $remote == 10::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => "http (80)", ); unless ($remote) ( die "cannot connect to http daemon on $host" ) $remote->autoflush(l) ; print $remote "GET $document HTTP/I.0\n\n"; while ( <$remote> ) ( print ) -close $remote; ) Подразумевается, что Web-сервер, на котором работает сервис http, использует свой стандартный порт (номер 80).\015\012.) Соединение с сервером — это лишь первый этап процесса: установив соединение, вы должны начать говорить на языке этого сервера. КажМы назовем нашу программу webget. Вот как ее можно было бы выполнить:shell prompt? webget www.peri.com /guanaco.html HTTP/I.I 404 File Not Found Date: Thu, 08 May 1997 18:02:32 GMT Server: Apache/1.2b6 Connection: close Content-type: text/html <HEADXTITLE>404 File Not Found</TITLEX/HEAD> <BODYXHl>File Not Found </H1> The request URL /guanaco.html was not found on this server. <P> </BODY> Это, конечно, не очень интересно, потому что программа не нашла конкретный документ, однако длинный ответ не поместился бы на этой странице. Чтобы ознакомиться с более развитой версией данной программы, вам нужно найти программу Iwp-request, входящую в состав модулей LWPИнтерактивный клиент Создать программу-клиент, которая просто читает все с сервера или посылает одну команду, получает один ответ, а затем завершает свою работу, очень легко. А как насчет создания чего-нибу Этот клиент — более сложный, чем те два, с которыми мы имели дело до сих пор, но если вы работаете в системе, которая поддерживает мощный вызов fork,Вот наш код:#!/usr/bin/peri -w use strict; use 10::Socket; my ($host, $port, $kidpid, $handle, $line); unless (8ARGV == 2 ) ( die "usage: $0 host port" ) ($host, $port) = 8ARGV; # создать tcp-соединение с указанным хостом и портом $handle - 10::Socket::INET->new(Proto => "tcp",PeerAddr => $host, PeerPort => $port) or die "can't connect to port $port on $host: $!"; $handle->autoflush(l); # и результат сразу же попадает туда print STDERR "[Connected to $host:$port]\n";# разбить программу на два процесса-близнецаdie "can't fork: $!" unless defined ($kidpid = fork()); # блок if{( выполняется только в родительском процессе if($kidpid) (# копировать данные из гнезда на стандартный вывод while (defined ($line = <$handle> )) f print STDOUT $line;1 kill ("TERM",$kidpid); # послать в порожденный процесс сигнал SIGTERM ># блок else(} выполняется только в порожденном процессе else 1# копировать данные со стандартного ввода в гнездо while (defined ($line = <STDIN>)) ( print $handle $line;} 1 * Принцип сохранения простоты — один из краеугольных камней не только философии UNIX,Функция kill в блоке if родительского процесса пошлет сигнал в нашЧто еще почитать о сетях О сетях можно говорить и говорить, но мы дадим ссылки на источники, которые помогут вам перейти от разговоров к делу. В главе 6 |
| Содержание | Предисловие | В |