Эффективное программирование TCP-IP

       

Помните, что С - не единственный язык программирования


| | |

До сих пор все примеры в этой книге были написаны на языке С, но, конечно, это не единственно возможный выбор. Многие предпочитают писать на 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-сокет.



Содержание раздела