Perl и работа с сокетами


Содержание

FPublisher

Web-технологии: База знаний

Работа с Сокетами в Perl: Загрузка файлов на удаленный сервер

Задача: Загрузить имеющийся файл на другой сервер через форму. Например у нас есть несколько сайтов, в базу данных которых нам надо добавить картинку-баннер со своего сервера, с описанием и своими личными данными (логин, пароль). Для этого будем использовать прямое соединение с сервером.

Задача: Загрузить имеющийся файл на другой сервер через форму. Например у нас есть несколько сайтов, в базу данных которых нам надо добавить картинку-баннер со своего сервера, с описанием и своими личными данными (логин, пароль). Для этого будем использовать прямое соединение с сервером.

Предположим Вы работаете менеджером по рекламе и вам необходимо подгружать один баннер в десяток другой баннерных систем. Чтобы не возится с каждым баннером, можно написать программу, автоматизирующую процесс подгрузки баннеров на несколько сайтов, защищенных паролем в хидден-поле(безопасность для данного примера работает при клиенте с аутентификацией через хидден-поля). Используя встроенную упаковку CGI.pm пакетов multipart/from можно напороться на то, что CGI.pm формируетй такой пакет, который может не разобрать программа, написанная, скажем на языке C. Т.е. CGI.pm формирует пакеты не совсем согласно rfc1867. Чтобы избежать этого неудобства, можно посылать картинки, используя Socket.pm. Т.е. нужно сформировать и отправить пакет в точности с rfc1867, который является стандартом для всех языков программирования. Ниже представлена программа, реализующая эту задачу:

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

Работа с perl-сокетами

Я начинаю программировать на сокеты Perl. На данный момент сервер отправляет строку, и клиент отвечает другой строкой в ​​моей программе. Позже, если сервер отправляет другую строку, клиент не может ее получить. Чтобы передавать данные между сервером и клиентом несколько раз, следует ли включать какие-либо функции?

Печать $ ServerData второй раз на стороне клиента не происходит.

    4 3
  • 29 янв 2014 2014-01-29 12:29:54
  • Raji

3 ответа

Если вы используете для чтения сообщения с другого конца, отправитель должен завершить сообщение « n». В качестве альтернативы вы можете использовать recv (. ), чтобы сообщение не буферизовалось до символа новой строки.

  • 18 янв 2020 2020-01-18 09:59:42
  • Acore

Просто убедитесь, что ваш клиент отправляет целую строку. SInce вы читаете:

Ваш сервер ожидает « n» от клиента.


  • 29 янв 2014 2014-01-29 13:58:32
  • Ingo

Ваш сервер начинает прослушивать какой-либо порт. Он ждет, пока клиент не подключится к этому соединению accept . Он считывает и записывает несколько данных по клиентскому соединению. А потом? Затем он просто закрывает сокет и выходит из программы.

Это не то, что вы намеревались: вы хотите, чтобы сервер начал ждать следующего соединения. Это означает, что некий цикл: Каждый раз, когда подключается клиент, мы сделаем наше общение:

Я рекомендую вам прочитать соответствующие разделы perldoc perlipc , но имейте в виду, что это использует устаревшие лучшие практики, поэтому дон Прямая копия ничего.

Работа с perl сокетами

Я новичок в программировании сокетов Perl. На данный момент сервер отправляет строку, а клиент отвечает другой строкой в моей программе. Позже, если сервер отправит другую строку, клиент не сможет ее получить. Нужно ли включать какие-либо функции для передачи данных между сервером и клиентом несколько раз?

Печать $ serverdata второй раз на стороне клиента не происходит.

3 ответа

Ваш сервер начинает прослушивать какой-то порт. Он ждет, пока клиент установит соединение, accept это соединение. Он читает и записывает немного данных через клиентское соединение. А потом? Затем он просто закрывает сокет и выходит из программы.

Это не то, что вы намеревались: вы хотите, чтобы сервер начал ожидать следующего соединения. Это означает какой-то цикл: каждый раз, когда клиент подключается, мы будем общаться:

Я рекомендую вам прочитать соответствующие разделы perldoc perlipc , но имейте в виду, что он использует устаревшие лучшие практики, поэтому не копируйте напрямую.

Если вы используете для чтения сообщения с другого конца, отправитель должен завершить сообщение с помощью «\ n». Кроме того, вы можете использовать recv (. ), чтобы сообщение не буферизовалось до символа новой строки.

Просто убедитесь, что ваш клиент отправляет целую строку. Так как вы читаете с

работа с сокетами на перле. нужна помошь

есть два скрипта. 1. #!/usr/bin/perl

use strict; use IO::Socket; use IO::Select;

my $texts=<>; my $serv=new IO::Socket::INET( Proto => ‘tcp’, LocalAddr => ‘10.0.36.10:25’, Listen => 10, Reuse => 1 );

my $sel=new IO::Select();

$sel->add($serv); my $timeout = 300;

/HELO/i ) < $cli->send(«Some answer»);# Send some data > > проблема — переменная $size не определена а переменная $tmp содержит в себе данные которые пришли по сети.

Re: работа с сокетами на перле. нужна помошь

скрипт 2 use strict; use IO::Socket;

my $local = IO::Socket::INET->new( Proto => ‘tcp’, LocalAddr => ‘10.0.36.10:25’, Listen => 5, Reuse => 1 ) or die «$!»;

print «At your service. Waiting. \n»;

my $addr; $|=1; my $SP = 255; my $CRLF = «\x0D\x0A»; my $CR = «\x0D»; my $LF = «\x0A»; open FH,»>/root/mail.tmp»;

while ($addr = $local->accept() ) < print "Connected from: ", $addr->peerhost(); print » Port: «, $addr->peerport(), «\n»; my $greeting = «220 Welcome to Qmail Toaster.\r\n»; print FH $greeting; print $greeting; my $mail_from; my $rcpt_to; my $temp; my $quest; $addr->send($greeting,1024); $|=1;

while ( ) < my $ans,$quest; my $stop = 0; $ans = ""; #$addr->send($data,64); while ($stop == 0) < #$addr->send(«»,1024); $addr->recv($ans,1024); print FH $ans; print $ans; if ($ans =

Илон Маск рекомендует:  Что такое код asp defaultdoc

/DATA/i) < $quest = "354 Start mail input; end with . \n"; $addr->send($quest,1024); print FH $quest; my $start_data = 1; while ($start_data == 1) < $addr->recv($ans,1024,0); print FH $ans; #print «Debug on:».$ans; $ans =

s/\015\012//gi; #print «Debug off:».$ans.»\n»;

if ($ans eq «.») < $start_data = 0; #print "\$start_data: ".$start_data."\n"; >else < print $ans."\n"; >> $quest = «250 Requested mail action okay, completed\n»; $addr->send($quest,1024); print FH $quest; > if ($ans =


/QUIT/i) < $quest = "See You.\n"; $addr->send($quest,1024); print FH $quest; $stop = 1; > if ($ans =

> # print $ans; > close $addr; print «Waiting next connection.\n»; > close FH; > проблема — почему то сервер в упор не видит первую строку. если пробовать телнетом то нужно нажать ентер а потом набирать команды.

очень нужна ваша помошь

Re: работа с сокетами на перле. нужна помошь

а кто форматировать будет??

Re: работа с сокетами на перле. нужна помошь

#!/usr/bin/perl -w use strict;use IO::Socket;use IO::Handle;use Socket;use Symbol;use POSIX;use Net::hostent;use Fcntl;use IO::Select; my $port=6002; my $host=»127.0.0.1″; my $PREFORK=»1″; my $MAX_CLIENTS_PER_CHILD=»1″;my %children=(); my $children=0;my $f=»/mnt/data/mnt/work/control.txt»;make_new_child() for(1 .. $PREFORK);$SIG=\&REAPER; $SIG=\&HUNTSMAN;while(1)< sleep; for(my $i=$children; $i new(SIGINT); sigprocmask(SIG_BLOCK, $sigset) or die "can't block SIGINT for fork: $!\n"; die "fork: $!" unless defined do<$p ; CHILD->autoflush(1); PARENT->autoflush(1); my $handle = IO::Socket::INET->new( Proto => ‘tcp’, PeerAddr => $host, PeerPort => $port) or die do< print "can't connect to port $port on $host: $!\n"; sleep 1; >; print «[Connected to $host:$port]\n»; die «can’t fork: $!» unless defined do <$k =>$k >new( LocalPort => 6003, Type => SOCK_STREAM, Proto => ‘tcp’, Reuse => 1, Listen => SOMAXCONN); die «making socket: $! $@» unless $server; print «go translate9\n»; while($client=$server->accept())< $client->autoflush(1); my $sad = $client -> sockname(); my ($p,$a)= sockaddr_in($sad); my $ph = inet_ntoa($a); print «[Connected from $p:$ph]\n»; my ($line, $line1); while (defined ($line = ))< print $handle $line; chomp($line1=

); print $client «$line1\n»; > # close $client; > close PARENT; close $client; > > exit; >>sub HUNTSMAN< local($SIG)=’IGNORE’; kill ‘INT’ => keys %children; exit;> sub REAPER< $SIG=\&REAPER; my $p >

Re: работа с сокетами на перле. нужна помошь

на странице «добавить коментарий» внизу, под полем ввод, есть выпадающая менюшка так вот выбери в ней «preformated text»

IO::Socket кто знает?

ОС Виндовс. Не смог найти ни одного рабочего примера. Нужно считать страничку любого сайта в интернете. Если возможно, то исходя из того, что IP сервера не знаю.

Добавлено через 17 минут
Самый похожий на правду скрипт.

16.10.2013, 21:23

обращаюсь к тем,кто знает JavaScript и Perl.
обращаюсь к тем,кто знает JavaScript и Perl. такая проблема. есть у меня две задачки.обе.

Кто знает и может подсказать с чего начать
Есть телефон! хотелось бы попробовать что-то сделать из его экранчика .Тока не в курсе с чего.

Socket. Отправка данных всем, кто знает адрес:порт сервера
Здравствуйте, уважаемые формучане, возник вопрос, а можно ли сделать такой C#-сервер, который.

Как это сделать кто знает? кто поможет?)
Задание № 8 Разработать базу данных «Пожарная охрана» Сведения: • Номер пожарного расчета.

Кто знает?
У меня есть ВЧ, когда его набираешь в ручную в Яше в поисковой строчке, то мой сайт на первом.

16.10.2013, 23:16 2 17.10.2013, 12:30 [ТС] 3 17.10.2013, 17:29 4
17.10.2013, 17:29
17.10.2013, 19:31 [ТС] 5

По момему несколько противоречит вот этому
Supporting HTTP 1.0 Requests

To be compatible with older browsers, HTTP 1.1 servers must support HTTP 1.0 requests. In particular, when a request uses HTTP 1.0 (as identified in the initial request line),

17.10.2013, 21:30 6
17.10.2013, 22:48 [ТС] 7
17.10.2013, 23:31 8
18.10.2013, 00:07 [ТС] 9

И вот так то же не проходит.

Добавлено через 13 минут
И через пробел то же не проходит

Добавлено через 14 секунд
И через пробел то же не проходит


18.10.2013, 12:45 10
18.10.2013, 17:58 [ТС] 11

Согласен у Вас абсолютно рабочий вариант. Спасибо огромное, у меня все получилось. В своих экспериментах, я не знал, что запрос должен быть обязательно «склеенный».
Теперь возник следующий вопрос, работают ли сокеты с куки, или надо генерировать самому, можно ли использовать куки от библиотеки Lwp, если соединение уже сделано через Сокеты. С куками я разобрался, в принципе можно и самому генерировать, но если есть модули, то зачем сложности?

Добавлено через 1 час 12 минут
print $sock «POST http://$url.$page. HTTP/1.1\nHost: .$url.\n.$brauser.$Accept.$Language.$qzip.$Accept_Charse.$Connection.$Content_Type.\n$Content_Length\n\n$action\n\n»;
Вот так работает на сокетах, не подскажите на LWP дать такой же запрос?
$req = POST «.

Добавлено через 6 секунд
print $sock «POST http://$url.$page. HTTP/1.1\nHost: .$url.\n.$brauser.$Accept.$Language.$qzip.$Accept_Charse.$Connection.$Content_Type.\n$Content_Length\n\n$action\n\n»;
Вот так работает на сокетах, не подскажите на LWP дать такой же запрос?
$req = POST «.

Добавлено через 1 час 16 минут
Кто раскажет как переделать под LWP?

Пишем простое клиент-серверное приложение на Perl

В этой статье я рассмотрю создание простого чата на Perl. Чат будет состоять из консольного сервера и клиента с GUI на основе Tk. Для начала реализуем серверную часть.
В серверной части мы не будем использовать процессы или потоки, а вместо этого воспользуемся мультиплексированием. Мультиплексирование довольно просто реализуется с помощью модуля IO::Select, который является классом-оболочкой над системной функцией select.
Функция select позволяет определить готовность дескриптора к записи/чтению. Также стоит отметить, что при использовании select следует избегать использования блокирующих вызовов, как, например, print, read, вместо них необходимо использовать syswrite, sysread.

Итак, начнем писать сервер:

В этом фрагменте мы включаем прагму strict, которая ограничивает применение небезопасных конструкций, подключаем модули IO::Select, IO::Socket::INET и объявляем несколько констант: имя файла логов, лимит размера буфера для некоторых операций ввода/вывода в скрипте, символы конца строки (если написать \r\n, то, в зависимости от платформы, \n может превратиться, например, в \r\n, что является нежелательным событием).

Сервер будет запускаться через консоль, в качестве аргументов запуска должны быть указаны IP и Порт, на которые сервер будет биндиться. Далее создается сокет для приема входящих соединений и объект IO::Select, который содержит дескриптор сокета.
Теперь рассмотрим основной цикл обработки входящих соединений:

/ \ x0A / or length $user_input >= SIZE ;

При каждой итерации цикла вызываются методы can_read и can_write, они возвращают список дескрипторов, готовых для чтения и записи. Следует отметить, что вызов can_read является блокирующим, а вызов can_write сбрасывается через 100 мс ожидания. Далее в цикле идет сравнение готовых к чтению дескрипторов с дескриптором слушающего сокетом. Если дескриптор к нему относится, то вызывается метод accept, который приводит к созданию нового подключенного сокета. Сокет в свою очередь добавляется к набору дескрипторов IO::Select с помощью метода add. Если дескриптор не является слушающим сокетом и готов для чтения, то из него читаются данные до тех пор, пока в них не обнаружится символ переноса строки или их размер не превысит значения константы SIZE.
Из полученных данных удаляются специальные символы (кроме табуляции). Если объем данных больше 0, то они передаются в функцию handle_request для дальнейшей обработки, а затем в обработанном виде рассылаются в дескрипторы, готовые для записи. В противном случае, запрос воспринимается как завершение сеанса работы с сервером, дескриптор удаляется из списка дескрипторов IO::Select и закрывается.
И, наконец, рассмотрим последний кусок кода сервера, а именно функцию handle_request.

Как видно из кода, в функцию передаются данные, поступившие от пользователя, и дескриптор клиента. Если от пользователя пришла команда LOG, то читается содержимое файла LOGFILE (если он существует) и отправляется пользователю. После этого функция возвращает undef, дабы команда не была продублирована в чат всем подключенным пользователям. Также хочу обратить внимание, что построчное чтение файла реализовано с помощью <>. В случае с мультиплексным сервером это неправильно, так как такое чтение является блокирующим, вместо него следовало бы написать собственную неблокирующую реализацию чтения или воспользоваться модулем IO::Getline.
Далее в функции пользовательские данные обрезаются и преобразуются в стандарт, установленный сервером: IP:Timestamp:Данные\r\n. После этого они записываются в LOGFILE и возвращаются в форматированном виде из функции, далее они будут отправлены всем подключенным клиентам.

Теперь рассмотрим графический клиент чата. Выглядеть он будет следующим образом:

Как обычно, начнем с прагм и инклюдов.

Чтобы не повторяться, опишу только новые фрагменты. В 3 строке мы импортируем функцию strftime их пакета POSIX. С помощью неё клиент преобразует timestamp, отправляемый сервером, в более читабельный вариант, как на картинке выше. Модули Tk, Tk::ROText и Tk::EntryCheck подключаются для создания графического интерфейса, ROText и EntryCheck — это так называемые виджеты. Прагма encoding необходима для нормального отображения русского языка в интерфейсе (по крайней мере, под win*).

Далее идет специальный блок BEGIN, который выполняется во время компиляции как можно раньше. В нем происходит проверка системы и, если скрипт запущен под ОС семейства Windows, то подключается модуль Win32::Console и вызывается метод Free, который консоль «освобождает». То есть при запуске двойным кликом, окно консоли не будет висеть на фоне.
Теперь определим несколько глобальных переменных и создадим интерфейс чата:

В переменной socket будет храниться дескриптор открытого сокета, в connection_state — состояние подключения. Метод MainWindow->new создает главное окно чата, в котором будут расположены прочие элементы интерфейса, параметр title задает текст заголовка окна. Метод geometry задает размеры окна. Далее мы создаем элемент, в котором будут находиться сообщения чата. Метод Scrolled указывает на наличие полос прокрутки у виджета, аргумент ROText уточняет тип (ReadOnly Text), -scrollbars => ‘e’ указывает, что полоса прокрутки необходима только справа (e -> east). Местоположение виджета на форме задается строкой pack(-fill => ‘both’, -expand => 1, -anchor => ‘n’).
Рассмотрим подробнее, что такое pack. В контексте Tk существуют 3 «способа» расположения элементов на форме, так называемые geometry managers, это: pack, place и grid. Pack не позволяет элементам формы перекрывать друг друга, то есть, следующая ситуация невозможна:

Параметр fill указывает на плоскость, которую займет виджет при расположении на форме (none, x, y или both). expand делает виджет «резновым», то есть виджет стремится занять доступное пространство по измерениям, указанным в параметре fill. Параметр anchor «цепляет» виджет к определенной стороне дочернего окна.
Подробнее про всё это можно прочитать в книге «Learning Perl/Tk: Graphical User Interfaces with Perl».
Далее по коду мы создаем поле для ввода EntryCheck. EntryCheck — это расширенный вариант виджета Entry, позволяющий указывать дополнительные атрибуты у поля, как, например, предельно допустимый размер вводимого текста (параметр maxlength). Параметр background задает цвет фона виджета, по умолчанию он серый у EntryCheck.
После создания виджета поля для ввода идет вызов метода bind, он привязывает к нажатию клавиши Enter функцию send, которая отвечает за отправку сообщений. Параметр after позволяет помещать один виджет после другого, что мы и делаем.
Далее мы создаем элемент Label с текстом, он просто отображает содержимое параметра text в указанном месте. Параметр side в методе pack указывает на положение виджета в окне, допустимые значения: left, right, top, bottom.
Следующие несколько виджетов, типа EntryCheck, обладают параметром pattern, он проверяет вводимые в поле символы на соответствие регулярному выражению, что дает возможность фильтрации (в этом примере поле Порт ограничено цифрами, а поле IP цифрами и точкой).
И, наконец, создается пара кнопок, на которые вешаются методы start и clear_chat. MainLoop завершает графическую часть клиента. Теперь рассмотрим методы, которые использует клиент:

Работа с сокетами и чтение из файла

server.pl
#!/usr/bin/perl
use IO::Socket;
$server = IO::Socket::INET->new(LocalPort => ‘4321’,Proto => «udp»)
or die «Couldn’t be a udp server on port $server_port : $@n»;
print «Working. \n»;
my $element;
my $MAX_TO_READ = 4096;
while(1) <
$server->recv($element,$MAX_TO_READ);
if($element ne «») <
open (LIST,»list») or die («Cannot open list»);
while (
) <
$server->send($_) if m/$element/;
>
close LIST;
>
else <
print «Exit\n»;
exit 1;
>
>

ну и файл — состоит из строк вида
1 first 225 680 400
2 second 234 555 332

Вот только интересное кино — как только я посылаю слово, которое заведомо в файле отсутствует происходит что-то непонятное — клиент перестает реагировать на пустой ввод — ну это мне понятно, почему. Ничего же от сервера не приходит. А вот почему не приходит — не пойму. Строки же в файле нет, логично было бы завершить и ждать следующего запроса. Пробовал переписать процесс поиска как
FIND: while (
) <
if($_ =

/$element/) <
$server->send($_);
last FIND;
>
else <
$server->send(«Sorry\n»);
last FIND;
>
>
Но это та еще чушь, потому что на запрос second оно выведет Sorry и все тут.
В перле я совсем начинающий, может кто поможет?

Работа перлов-сокетов

Я новичок в программировании сокетов Perl. На данный момент сервер отправляет строку, и клиент отвечает другой строкой в моей программе. Позже, если сервер отправляет другую строку, клиент не может ее получить. Чтобы передавать данные между сервером и клиентом несколько раз, следует ли включать какие-либо функции?

Печать второй версии serverdata на стороне клиента не происходит.

Ваш сервер начинает прослушивать какой-то порт. Он ждет, пока клиент не подключится, и accept это соединение. Он считывает и записывает несколько данных по клиентскому соединению. А потом? Затем он просто закрывает сокет и выходит из программы.

Это не то, что вы намеревались: вы хотите, чтобы сервер начал ждать следующего соединения. Это означает какой-то цикл: каждый раз, когда клиент подключается, мы будем делать наше сообщение:

Я рекомендую вам ознакомиться с соответствующими разделами perldoc perlipc , но имейте в виду, что он использует устаревшие передовые методы, поэтому ничего не копируйте напрямую.


Если вы используете для чтения сообщения с другого конца, отправитель должен завершить сообщение «\n». Кроме того, вы можете использовать recv (. ), чтобы сообщение не буферизовалось до символа новой строки.

Perl и работа с сокетами

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

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

DOMAIN — это коммуникационный домен. Не нужно его путать с доменом сервера с которым мы соединяемся. В нашем случае это будет Internet домен (бывает еще Unix домен) а потому указываем: PF_INET

TYPE — это тип сокета. Мы будем использовать SOCK_STREAM — этот тип обеспечивает последовательный, надежный поток байтов. Так же существуют Datagram socket и Raw socket, но о них как-нибудь в другой раз.

PROTOCOL — протокол, по которому будет устанавливаться соединение. В нашем случае это tcp поэтому вместо PROTOCOL вставляем следующее:
getprotobyname(‘tcp’);

Помимо tcp можно использовать udp, ip и т.д. Функция getprotobyname возвращает название протокола в более удобном для функции socket виде.
Итак создаем сокет:

Когда сокет готов, можно подключаться к конкретному серверу. Для этого нам нужен адрес сервера и порт. Предварительно, необходимо сделать следующее:

Теперь все готово и мы можем использовать функцию connect:

После соединения с сервером, мы можем передавать и принимать некоторую информацию. Рассмотрим процесс передачи и приема данных, более подробно, на примере соединения с Web-сервером и получения с него некоторого документа. Для отправки сообщения через сокет служит функция send:

Вместо 0 может быть один из перечисленных флагов:
MSG_OOB — Посылать/получать данные, характерные для сокетов типа SOCK_STREAM
MSG_DONTROUTE — Посылать данные без маршрутизации пакетов. Как правило используется диагностическими программами и процессами управляющими таблицами маршрутизации.
Для приема данных через сокет, используем стандартную операцию:

После окончания сеанса связи, необходимо закрыть сокет, при этом серверу сообщается что сеанс связи закончен. Для закрытия сокета служит функция close, которой необходимо передать дескриптор сокета.

Ну и на последок пример рабочего кода. Программа соединяется с сервером www.perl.ru и забирает от туда главную страницу.

Если вы попробуете поменять значения переменной $host, то обнаружите, что с некоторых серверов приходит сообщение об ошибке. Всему причиной HTTP протокол и настройки Web-серверов. Более подробно о HTTP читайте в статье «HTTP протокол». А пока о том как с этим бороться.
Дело в том, что в сети существует очень большое количество виртуальных серверов, т.е. серверов с разными именами, но одним IP адресом. Попробуйте например сделать Ping Любое_имя.narod.ru. Все они будут иметь один IP адрес. А поскольку наш сокет фактически соединяется с IP адресом, то мы и получаем сообщение об ошибке. Web-сервер того же narod.ru просто не знает страницы какого из виртуальных серверов показывать. Значит нужно объяснить ему это. Для этого существует переменная HOST которая указывается в заголовке запроса. Т.е.

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

работа с сокетами на перле. нужна помошь

есть два скрипта. 1. #!/usr/bin/perl

use strict; use IO::Socket; use IO::Select;

my $texts=<>; my $serv=new IO::Socket::INET( Proto => ‘tcp’, LocalAddr => ‘10.0.36.10:25’, Listen => 10, Reuse => 1 );

my $sel=new IO::Select();

$sel->add($serv); my $timeout = 300;

/HELO/i ) < $cli->send(«Some answer»);# Send some data > > проблема — переменная $size не определена а переменная $tmp содержит в себе данные которые пришли по сети.

Re: работа с сокетами на перле. нужна помошь

скрипт 2 use strict; use IO::Socket;

my $local = IO::Socket::INET->new( Proto => ‘tcp’, LocalAddr => ‘10.0.36.10:25’, Listen => 5, Reuse => 1 ) or die «$!»;

print «At your service. Waiting. \n»;

my $addr; $|=1; my $SP = 255; my $CRLF = «\x0D\x0A»; my $CR = «\x0D»; my $LF = «\x0A»; open FH,»>/root/mail.tmp»;

while ($addr = $local->accept() ) < print "Connected from: ", $addr->peerhost(); print » Port: «, $addr->peerport(), «\n»; my $greeting = «220 Welcome to Qmail Toaster.\r\n»; print FH $greeting; print $greeting; my $mail_from; my $rcpt_to; my $temp; my $quest; $addr->send($greeting,1024); $|=1;

while ( ) < my $ans,$quest; my $stop = 0; $ans = ""; #$addr->send($data,64); while ($stop == 0) < #$addr->send(«»,1024); $addr->recv($ans,1024); print FH $ans; print $ans; if ($ans =

/DATA/i) < $quest = "354 Start mail input; end with . \n"; $addr->send($quest,1024); print FH $quest; my $start_data = 1; while ($start_data == 1) < $addr->recv($ans,1024,0); print FH $ans; #print «Debug on:».$ans; $ans =

s/\015\012//gi; #print «Debug off:».$ans.»\n»;

if ($ans eq «.») < $start_data = 0; #print "\$start_data: ".$start_data."\n"; >else < print $ans."\n"; >> $quest = «250 Requested mail action okay, completed\n»; $addr->send($quest,1024); print FH $quest; > if ($ans =

/QUIT/i) < $quest = "See You.\n"; $addr->send($quest,1024); print FH $quest; $stop = 1; > if ($ans =

> # print $ans; > close $addr; print «Waiting next connection.\n»; > close FH; > проблема — почему то сервер в упор не видит первую строку. если пробовать телнетом то нужно нажать ентер а потом набирать команды.

очень нужна ваша помошь

Re: работа с сокетами на перле. нужна помошь

а кто форматировать будет??

Re: работа с сокетами на перле. нужна помошь

#!/usr/bin/perl -w use strict;use IO::Socket;use IO::Handle;use Socket;use Symbol;use POSIX;use Net::hostent;use Fcntl;use IO::Select; my $port=6002; my $host=»127.0.0.1″; my $PREFORK=»1″; my $MAX_CLIENTS_PER_CHILD=»1″;my %children=(); my $children=0;my $f=»/mnt/data/mnt/work/control.txt»;make_new_child() for(1 .. $PREFORK);$SIG=\&REAPER; $SIG=\&HUNTSMAN;while(1)< sleep; for(my $i=$children; $i new(SIGINT); sigprocmask(SIG_BLOCK, $sigset) or die "can't block SIGINT for fork: $!\n"; die "fork: $!" unless defined do<$p ; CHILD->autoflush(1); PARENT->autoflush(1); my $handle = IO::Socket::INET->new( Proto => ‘tcp’, PeerAddr => $host, PeerPort => $port) or die do< print "can't connect to port $port on $host: $!\n"; sleep 1; >; print «[Connected to $host:$port]\n»; die «can’t fork: $!» unless defined do <$k =>$k >new( LocalPort => 6003, Type => SOCK_STREAM, Proto => ‘tcp’, Reuse => 1, Listen => SOMAXCONN); die «making socket: $! $@» unless $server; print «go translate9\n»; while($client=$server->accept())< $client->autoflush(1); my $sad = $client -> sockname(); my ($p,$a)= sockaddr_in($sad); my $ph = inet_ntoa($a); print «[Connected from $p:$ph]\n»; my ($line, $line1); while (defined ($line = ))< print $handle $line; chomp($line1=

); print $client «$line1\n»; > # close $client; > close PARENT; close $client; > > exit; >>sub HUNTSMAN< local($SIG)=’IGNORE’; kill ‘INT’ => keys %children; exit;> sub REAPER< $SIG=\&REAPER; my $p >

Re: работа с сокетами на перле. нужна помошь

на странице «добавить коментарий» внизу, под полем ввод, есть выпадающая менюшка так вот выбери в ней «preformated text»

Илон Маск рекомендует:  Регламентное обслуживание всех таблиц БД MySQL
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL