Итак программа клиента эхо-сервера tcp_echo_clil.pl приведена ниже. Она также незаменима при программировании сетевых приложений. Вначале рассмотрим все строки этого кода, а затем опишем, что и почему здесь было сделано.
Клиент эхо-сервера TCP
#!/usr/local/bin/perl
# Файл: tcp_echo_clil.pl
# Применение: tcp_echo_clil.pl [хост] [порт]
# Эхо-клиент, версия для TCP use strict;
use Socket; use IO::Handle;
my ($bytes_out,$bytes_in) = (0,0);
my $host = shift || 'localhost';
my $port = shift || getservbyname ('echo', 'tcp') ;
my $protocol = getprotobyname ('tcp');
$host =inet_aton($host) or die "$host: unknown host"; socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die "socket() failed: $!";
my $dest_addr = sockaddr_in($port,$host);
connect(SOCK, $dest_addr) or die "connect() failed: $!"; SOCK->autoflush(1);
Строки 13,14. Формирование адреса назначения и подключение к нему сокета. Для создания упакованного адреса, содержащего IP-адрес и номер порта назначения, применяется функция sockaddr_in(). Теперь этот адрес используется в качестве адреса назначения в вызове функции connect(). В случае успешного выполнения функция connect() возвращает истинное значение. В ином случае вызывается функция die с сообщением об ошибке.
Строка 15. Включение режима автоматического сброса для сокета. Данные, записанные в сокет, должны немедленно сбрасываться из локального буфера, а не накапливаться в нем. Для включения режима автоматического сброса вызывается метод autoflush() сокета. Этот метод становится доступным в результате загрузки модуля IO::Handle.
Строки 16-22. Вход в главный цикл. Теперь программа входит в главный цикл. При каждом проходе по этому циклу выполняется чтение строки текста из стандартного устройства ввода и вывод ее в неизменном виде в сокет sock, т.е. отправка на удаленный хост. Затем осуществляется чтение строки ответа сервера с помощью оператора и вывод ее на стандартное устройство вывода.
При каждом проходе по циклу подсчитывается число отправленных и полученных байтов. Это продолжается до тех пор, пока не будет достигнут конец файла EOF на стандартном устройстве ввода.
Строки 23,24. Закрытие сокета и вывод статистической информации. После завершения цикла сокет закрывается и на стандартное устройство вывода сообщений об ошибках выводятся итоговые статистические данные о числе отправленных и полученных байтов.
Сеанс работы с программой tcp_echo_clil.pl выглядит примерно так:
% tcp_echo_clil.pl
How now brown cow?
How now brown cow?
There’s an echo in here.
There’s an echo in here.
Yo-de-lay-ee-oo!
Yo-de-lay-ee-oo!
^D
bytes_sent = 61, bytes_received = 61
Сочетание символов в предпоследней строке распечатки сеанса показывает, где автору надоела эта игра и он нажал комбинацию клавиш конца ввода. (В системе Windows это была бы комбинация клавиш .)