Клиент TCP
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: банк рефератов бесплатно, деятельность доклад
| Добавил(а) на сайт: Виргиния.
Предыдущая страница реферата | 1 2 3 | Следующая страница реферата
print join("",@body);
После подключения модуля Socket мы проверяем достаточно ли аргументов передано на вход программы. Согласно описанию, запуск программы должен аргументироваться двумя значениями: именем хоста и виртуальным путем получаемого документа. Так вот, если массив входных аргументов не содержит необходимых двух аргументов, тогда программа завершается.
Следующий шаг выполняет идентификацию сокета. Функция GetSockName() принимает в качестве аргумента имя хоста (или его IP-адрес) и номер порта. Если кому то непонятен смысл терминов хост и порт, то можно провести такую аналогию: что бы попасть в гости к своему знакомому вы должны знать номер дома и номер квартиры. Вот здесь номер дома - это IP-адрес компьютера, к которому производится подключение, а квартира - номер порта.
Реализация функции идентификации сокета на мой взгляд очень удобна, так как скрывает все непонятности. К тому же, как я уже говорил, определение имени сокета это обязательный процесс как для сервера, так и для клиента. По этому мы с легкостью сможем использовать функцию GetSockName() в наших следующих программах.
После идентификации сокета мы создаем сокет с помощью встроенной функции socket(). В качестве аргументов эта функция принимает дескриптор соединения (на заметку: обычный файловый манипулятор), константу, определяющую область действия сокета (PF_INET или PF_UNIX), константу, определяющую тип сокета (датаграмный или потоковый) и идентификатор протокола. Идентификатор протокола соответствующий установленному в системе определяется числовым значением в.с помощью функции getprotobyname().
После того, как сокет создан, мы пытаемся соединиться с удаленным сервером. Делается это с помощью функции connect(), в качестве аргументов которой принимается дескриптор и идентификатор сокета. В случае неудачной попытки соединения программа завершается с ошибкой. Далее операторы print, которые следуя правилам протокола HTTP объявляют о необходимости выдать указанный документ. В массив @body мы сохраняем данные, полученные от сервера. Закрываем соединение и выводим содержимое массива @body. Вот и наш документ.
Функция GetSockName
Теперь разберем функцию 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.0n";
Вот теперь все должно работать.
Заключение
Наша программа, конечно, не супер-пупер, но на кое-что она все-таки сгодится. Например, если отделить заголовки ответа от, непосредственно, тела ответа, то можно скачивать файлы по HTTP. Давайте так и сделаем.
Как нам известно, ответ сервера состоит из заголовка и тела. При чем, заголовок ответа отделяется от тела двумя переводами строки. Вот и найдем эти два перевода строки:
Рекомендуем скачать другие рефераты по теме: бесплатные рефераты скачать, матершинные частушки.
Категории:
Предыдущая страница реферата | 1 2 3 | Следующая страница реферата