Реферат: Клиент TCP
Теперь разберем функцию GetSockName().
sub GetSockName{
my ($nm,$pt) = @_;
return undef unless defined($nm);
return undef unless defined($pt);
return undef unless $nm = gethostbyname($nm);
return sockaddr_in($pt,$nm);
}
Вот такая незамысловатая функция спасает нас от головной боли при идентификации сокета. С помощью функции gethostbyname() мы получаем IP-адрес хоста назначения. Иначе это называется разрешением имени. Функция sockaddr_in() входит в состав модуля Socket. В скалярном контексте sockaddr_in упаковывает номер порта и адрес хоста в структуру SOCKADDR_IN.
Теперь давайте попробуем, что же у нас получилось. Запускаем программу и... Ха-ха-ха. Что, опять зависли? Ну и где же у нас ошибка? Правильно, мы забыли отключить буфферизацию. Данные как бы отправлены, но их слишком мало для заполнения буффера. Поэтому фактически, наши отправленные данные застряли в сокете. А сервер ждет и ждет, когда же клиент заявит о своем желании. Давайте исправим положение и добавим следующий код между строк:
connect(CONN,$sock_name)
or die "Couldn't' connect to $ARGV[0]: $!\n";
select(CONN); $|=1; select(STDOUT);
print CONN "GET $ARGV[1] HTTP/1.0\n";
Вот теперь все должно работать.
Заключение
Наша программа, конечно, не супер-пупер, но на кое-что она все-таки сгодится. Например, если отделить заголовки ответа от, непосредственно, тела ответа, то можно скачивать файлы по HTTP. Давайте так и сделаем.
Как нам известно, ответ сервера состоит из заголовка и тела. При чем, заголовок ответа отделяется от тела двумя переводами строки. Вот и найдем эти два перевода строки:
print CONN "GET $ARGV[1] HTTP/1.0\n";
print CONN "Host: $ARGV[0]\n\n";
my $body = "";
$body .= $_ while <CONN>;
close(CONN);
$body =~ s/^.+?\n\r?\n\r?//s;
print $body;
Теперь мы можем выполнить команду:
[root@avalon scripts]# ./gethttp.pl whirlwind.ru /index.cgi > index.html
для получения HTML-кода индексной страницы нашего сайта.
Ну и все, для начала. У вас уже достаточно навыков для возни с протоколами высокого уровня. Вот и попробуйте поработать с FTP, или SMTP.