Навигация
Главная
Поиск
Форум
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
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 62806
Создание отчето... 62798
ТЕХНОЛОГИИ ДОСТ... 59332
Пример работы с... 58054
Имитационное мо... 54724
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

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

База данных электронного документооборота на Delphi + бд Intebase
Расчет мер близости на отношениях на Delphi + Пояснительная записка
Информационная система - продуктовый магазин на Turbo Pascal (База данны...

Реклама



Подписывайся на 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 Комментариев · 6652 Прочтений · Для печати

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


Комментарии
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...
Шаблон для новост...

Случайные загрузки
Аватары в комме...
3D Тетрис [Исходн...
AUTOWEB
netBIOS
mmmJlabel
Progressbar
Сложный калькулятор
«Философия» прогр...
SynEdit
Реализация ЭЦП по...
Расширенный загру...
PCXReader. Програ...
Добавление к ссы...
Игра змейка
Adapter (пример D...
Plasma
Векторный редакто...
3d Tank [Исходник...
Counter [Исходник...
Архив Апгрейтов с...

Топ загрузок
Приложение Клие... 100422
Delphi 7 Enterp... 84933
Converter AMR<-... 20062
GPSS World Stud... 11964
Borland C++Buil... 11406
Borland Delphi ... 8377
Turbo Pascal fo... 7008
Visual Studio 2... 4985
Калькулятор [Ис... 4628
FreeSMS v1.3.1 3530
Случайные статьи
Генератор случайны...
Перегрузка операци...
Эмуляция классов
Клуб вулкан — подк...
11.1. Сортировка в...
использование SNMP...
Ваш выбор заметноп...
Установка IBM WebS...
Специализация
Интернет-соединени...
4.3. Понимание про...
Отправка и получен...
NetWare можгю, уст...
Организация видеоа...
Внутренние проверки
Примеры правил - и...
7.5. Принципы
Замена мембран кнопок
Ввод и вывод. Чтен...
Глава 15
Снизить шанс досту...
Множественное насл...
Связывание потоков...
общими- Иначе гово...
Конфигурируя бранд...
Статистика



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


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