|
Все для программиста! |
| ||||||||||||||||||||||||||||||||
|
Perl и работа с сокетамиPhilip A. Koryaka <flp@mail.ru>
Иногда возникает необходимость из программы на перле соединиться с другим сервером и передать/принять какую-нибудь информацию. Как правило, возникает необходимость работать с протоколом HTTP, но поняв основные принципы взаимодействия между двумя серверами и прочитав спецификацию интересующего протокола, можно написать программу, работающую практически через любой протокол. Далее мы рассмотрим работу с протоколом HTTP. socket(SOCK, DOMAIN, TYPE, PROTOCOL);
Данная функция открывает сокет и привязывает его к указателю SOCK.
getprotobyname('tcp');
Помимо tcp можно использовать udp, ip и т.д. Функция getprotobyname возвращает название протокола в более удобном для функции socket виде.
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
Когда сокет готов, можно подключаться к конкретному серверу. Для этого нам нужен адрес сервера и порт. Предварительно, необходимо сделать следующее: # Конвертирует имя сервера в бинарную последовательность. $iaddr = inet_aton($host); # Упаковывает все в понятную функции connect последовательность. $paddr = sockaddr_in($port, $iaddr); Теперь все готово и мы можем использовать функцию connect: connect(SOCK, $paddr); После соединения с сервером, мы можем передавать и принимать некоторую информацию. Рассмотрим процесс передачи и приема данных, более подробно, на примере соединения с Web-сервером и получения с него некоторого документа. Для отправки сообщения через сокет служит функция send: send (SOCK, "То что шлем", 0);
Вместо 0 может быть один из перечисленных флагов: @data=<SOCK>; После окончания сеанса связи, необходимо закрыть сокет, при этом серверу сообщается что сеанс связи закончен. Для закрытия сокета служит функция close, которой необходимо передать дескриптор сокета. close(SOCK); Ну и на последок пример рабочего кода. Программа соединяется с сервером www.perl.ru и забирает от туда главную страницу.
use Socket;
$host="www.perl.ru";
$port="80";
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);
connect(SOCK, $paddr);
send (SOCK, "GET / HTTP/1.0\n\n", 0);
@data=<SOCK>;
close(SOCK);
print @data;
Если вы попробуете поменять значения переменной $host, то обнаружите, что с некоторых серверов приходит сообщение об ошибке. Всему причиной HTTP протокол и настройки Web-серверов. Более подробно о HTTP читайте в статье "HTTP протокол". А пока о том как с этим бороться. send (SOCK, "GET / HTTP/1.0\nHOST:$host\n\n", 0); Подставив эту строчку в наш скрипт, мы получим уже более совершенную программу. Так же, некоторые сервера в зависимости от браузера (а вы еще не ощущаете себя им?) показывают разные версии сайтов. Встречается такое крайне редко, но к этому нужно быть готовым. Используйте для них переменную USER-AGENT. Комментарии пользователей (всего 7)Алексей / 07 мая 2006, 16:27:46Статья неплохая, но информации мало. :) Konstantin / 30 апреля 2006, 00:29:35Вообще неплохо, но хорошо бы еще сказать про организацию сокетов на стороне сервера.. jack / 15 ноября 2005, 16:52:19Все хорошо. Мне помогло только вот в переменную $host ничего кроме ip неполучилось вложить и соответственно не получается с последней командой для отправки переменной HOST. Там надо вписать без использования $host символьное имя виртуального сервера. 09h / 16 октября 2005, 02:42:37УРРРРРРААААААА!!!! unel / 07 октября 2005, 08:09:28очень даже всё что нужно сказано. спасибо большое. вот. тока упустили примечание что сначала надо use Socket сделать ... впринципе, в примере это написано :))) так что всё - гуд ) Anton / 27 июля 2005, 12:38:44Для дураков может и мало. А от меня огромное спасибо. Melinger / 05 мая 2005, 05:03:01Сказано настолько мало, что лучше б не сказано было ничего. |