Помните, что С - не единственный язык программирования
| | |
До сих пор все примеры в этой книге были написаны на языке С, но, конечно, это не единственно возможный выбор. Многие предпочитают писать на C++, Java или даже Pascal. В этом разделе будет рассказано об использовании языков сценарИ" ев для сетевого программирования и приведено несколько примеров на языке Perl Вы уже встречались с несколькими примерами небольших программ, написанных специально для тестирования более сложных приложений. Например, в совете 30 использованы простые и похожие программы udpclient, udpconnl и udpconn2 для проверки поведения подсоединенного UDP-сокета. В таких случаях имеет смысл воспользоваться каким-либо языком сценариев. Сценарии проще разрабатывать и модифицировать хотя бы потому, что их не надо компилировать и компоновать со специальной библиотекой, а также создавать файлы сборки проекта (Makefile)— достаточно написать сценарий и сразу же запустить его.
В листинге 3.36 приведен текст минимального Perl-сценария, реализующего функциональность программы udpclient.
Хотя я не собираюсь писать руководство по языку Perl, но этот пример стоит изучить подробнее.
Примечание: Глава 6 стандартного учебника по Perl [Wall et al. 1996] посвящена имеющимся в этом языке средствам межпроцессного взаимодействия и сетевого программирования. Дополнительную информацию о языке Perl можно найти на сайте http://www.perl.com.
Листинг 3.36. Версия программы udpclient на языке Perl
1 #! /usr/bin/perl5
2 use Socket;
3 $host = shift "localhost";
4 $port = shift "echo";
5 $port = getservbyname( $port, "udp" ) if $port =~ /\D/;
6 $peer = sockaddr_in( $port, inet_aton( $host ) );
7 socket(S,PF_INET,SOCK_DGRAM,0) die "ошибка вызова socket $!";
8 while ( $line = <STDIN> )
9 {
10 defined) send(S,$line,0,$peer)) die "ошибка вызова send $!";
11 defined) recv(S, $line, 120, 0)) die "ошибка вызова recv $!";
12 print $line;
13 }
Инициализация
2 В этой строке Perl делает доступными сценарию определения некоторых констант (например, PF_INET).
Получение параметров командной строки
3-4 Из командной строки читаем имя хоста и номер порта. Обратите внимание, что этот сценарий делает больше, чем программа на языке С, так как по умолчанию он присваивает хосту имя localhost, а порту -echo, если один или оба параметра не заданы явно.
Заполнение структуры sockaddr_in и получение сокета
5-6 Этот код выполняет те же действия, что и функция set_address в листинге 2.3 в совете 4. Обратите внимание на простоту кода. В этих двух строчках IP-адрес хоста принимается как числовой и его имя символическое, а равно числовое или символическое имя сервиса.
7 Получаем UDP-сокет.