Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 65333
Организация зап... 60923
Приложение «Про... 60919
Invision Power ... 60586
Оператор выбора... 59707
Подключение Mic... 58644
Модуль Forms 58595
Создание отчето... 58087
ТЕХНОЛОГИИ ДОСТ... 54353
Программируемая... 52878
Пример работы с... 50945
Имитационное мо... 49788
21 ошибка прогр... 44770
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,052
новичок: eugeniofonseca
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Программа тестирования (тест) - вступительные экзамены (математика, физи...
Движение шарика в эллиптическои параболоиде на Delphi [OpenGL] + Блок схемы
База данных студентов на Delphi + Microsoft SQL Server

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Perl и работа с сокетами
Иногда возникает необходимость из программы на перле соединиться с другим сервером и передать/принять какую-нибудь информацию. Как правило, возникает необходимость работать с протоколом HTTP, но поняв основные принципы взаимодействия между двумя серверами и прочитав спецификацию интересующего протокола, можно написать программу, работающую практически через любой протокол. Далее мы рассмотрим работу с протоколом HTTP.
Первое что нам понадобится это - сокеты (sockets). Сокет - это канал, проложенный между сервером на котором запускается программа и сервером, с которым мы хотим установить соединение. Для работы с сокетами в перле есть модуль - Socket.
Для создания сокета используется функция socket. Формат ее таков:

socket(SOCK, DOMAIN, TYPE, PROTOCOL);

Данная функция открывает сокет и привязывает его к указателю SOCK.

  • DOMAIN - это коммуникационный домен. Не нужно его путать с доменом сервера с которым мы соединяемся. В нашем случае это будет Internet домен (бывает еще Unix домен) а потому указываем: PF_INET
  • TYPE - это тип сокета. Мы будем использовать SOCK_STREAM - этот тип обеспечивает последовательный, надежный поток байтов. Так же существуют Datagram socket и Raw socket, но о них как-нибудь в другой раз.
  • PROTOCOL - протокол, по которому будет устанавливаться соединение. В нашем случае это tcp поэтому вместо PROTOCOL вставляем следующее:
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 может быть один из перечисленных флагов:
MSG_OOB - Посылать/получать данные, характерные для сокетов типа SOCK_STREAM
MSG_DONTROUTE - Посылать данные без маршрутизации пакетов. Как правило используется диагностическими программами и процессами управляющими таблицами маршрутизации.
Для приема данных через сокет, используем стандартную операцию:

@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 протокол". А пока о том как с этим бороться.
Дело в том, что в сети существует очень большое количество виртуальных серверов, т.е. серверов с разными именами, но одним IP адресом. Попробуйте например сделать Ping Любое_имя.narod.ru. Все они будут иметь один IP адрес. А поскольку наш сокет фактически соединяется с IP адресом, то мы и получаем сообщение об ошибке. Web-сервер того же narod.ru просто не знает страницы какого из виртуальных серверов показывать. Значит нужно объяснить ему это. Для этого существует переменная HOST которая указывается в заголовке запроса. Т.е.

send (SOCK, "GET / HTTP/1.0\nHOST:$host\n\n", 0);

Подставив эту строчку в наш скрипт, мы получим уже более совершенную программу. Так же, некоторые сервера в зависимости от браузера (а вы еще не ощущаете себя им?) показывают разные версии сайтов. Встречается такое крайне редко, но к этому нужно быть готовым. Используйте для них переменную USER-AGENT.

Опубликовал Kest October 31 2008 18:53:36 · 1 Комментариев · 6046 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Noname December 06 2013 15:36:54
Джигурда вам в помощь!smileysmileysmileysmileysmiley
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Animation Effect ...
PHP 5. Полное рук...
Игра Car [Исходни...
Язык программиров...
Visual Studio 200...
Использование Lis...
Добавление к ссы...
Zoom [Исходник на...
EditNew
PHP/MySQL для нач...
Geo-Whois
C++ : библиотека ...
Как программирова...
CS:Source - монит...
oTextrackBar
Панель случайной ...
index.php + мод ...
mmmJlabel
Самоучитель PHP 4
С/C++ Программиро...

Топ загрузок
Приложение Клие... 100347
Delphi 7 Enterp... 81003
Converter AMR<-... 20031
Borland C++Buil... 10890
GPSS World Stud... 9994
Borland Delphi ... 7930
Turbo Pascal fo... 6930
Visual Studio 2... 4937
Калькулятор [Ис... 4187
FreeSMS v1.3.1 3494
Случайные статьи
Base) 326Microsoft...
Определение типа д...
Формирование сообщ...
Процедура GetFillP...
Архитектура Ethern...
Режим Ночной портр...
Профили плотности ...
Процедуры и функции
Помещение формы в ...
Параметры, диагнос...
Процедура MoveTo -...
Краткий обзор инте...
Переменные в FORMS
3. См. задачу 2. Р...
Если ГВС-канал свя...
Часть 1. Проблема
Графический и HTML...
9. На все участвую...
Объектная модель M...
Первое правило Net...
Три задачи
Построение множест...
Ошибка EOLESYS..OP...
MediaDesc
Текстовое наполнен...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?