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 =
/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
); print $client «$line1\n»; > # close $client; > close PARENT; close $client; > > exit; >>sub HUNTSMAN< local($SIG
Re: работа с сокетами на перле. нужна помошь
на странице «добавить коментарий» внизу, под полем ввод, есть выпадающая менюшка так вот выбери в ней «preformated text»
IO::Socket кто знает?
ОС Виндовс. Не смог найти ни одного рабочего примера. Нужно считать страничку любого сайта в интернете. Если возможно, то исходя из того, что IP сервера не знаю.
Добавлено через 17 минут
Самый похожий на правду скрипт.
обращаюсь к тем,кто знает JavaScript и Perl.
обращаюсь к тем,кто знает JavaScript и Perl. такая проблема. есть у меня две задачки.обе.
Кто знает и может подсказать с чего начать
Есть телефон! хотелось бы попробовать что-то сделать из его экранчика .Тока не в курсе с чего.
Socket. Отправка данных всем, кто знает адрес:порт сервера
Здравствуйте, уважаемые формучане, возник вопрос, а можно ли сделать такой C#-сервер, который.
Как это сделать кто знает? кто поможет?)
Задание № 8 Разработать базу данных «Пожарная охрана» Сведения: • Номер пожарного расчета.
Кто знает?
У меня есть ВЧ, когда его набираешь в ручную в Яше в поисковой строчке, то мой сайт на первом.
17.10.2013, 17:29 | |
17.10.2013, 19:31 [ТС] | 5 |
По момему несколько противоречит вот этому 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 |
Согласен у Вас абсолютно рабочий вариант. Спасибо огромное, у меня все получилось. В своих экспериментах, я не знал, что запрос должен быть обязательно «склеенный». Добавлено через 1 час 12 минут Добавлено через 6 секунд Добавлено через 1 час 16 минут Пишем простое клиент-серверное приложение на PerlВ этой статье я рассмотрю создание простого чата на Perl. Чат будет состоять из консольного сервера и клиента с GUI на основе Tk. Для начала реализуем серверную часть. Итак, начнем писать сервер: В этом фрагменте мы включаем прагму 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. Как видно из кода, в функцию передаются данные, поступившие от пользователя, и дескриптор клиента. Если от пользователя пришла команда LOG, то читается содержимое файла LOGFILE (если он существует) и отправляется пользователю. После этого функция возвращает undef, дабы команда не была продублирована в чат всем подключенным пользователям. Также хочу обратить внимание, что построчное чтение файла реализовано с помощью <>. В случае с мультиплексным сервером это неправильно, так как такое чтение является блокирующим, вместо него следовало бы написать собственную неблокирующую реализацию чтения или воспользоваться модулем IO::Getline. Теперь рассмотрим графический клиент чата. Выглядеть он будет следующим образом: Как обычно, начнем с прагм и инклюдов. Чтобы не повторяться, опишу только новые фрагменты. В 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’). Параметр fill указывает на плоскость, которую займет виджет при расположении на форме (none, x, y или both). expand делает виджет «резновым», то есть виджет стремится занять доступное пространство по измерениям, указанным в параметре fill. Параметр anchor «цепляет» виджет к определенной стороне дочернего окна. Работа с сокетами и чтение из файлаserver.pl ну и файл — состоит из строк вида Вот только интересное кино — как только я посылаю слово, которое заведомо в файле отсутствует происходит что-то непонятное — клиент перестает реагировать на пустой ввод — ну это мне понятно, почему. Ничего же от сервера не приходит. А вот почему не приходит — не пойму. Строки же в файле нет, логично было бы завершить и ждать следующего запроса. Пробовал переписать процесс поиска как /$element/) < Работа перлов-сокетовЯ новичок в программировании сокетов Perl. На данный момент сервер отправляет строку, и клиент отвечает другой строкой в моей программе. Позже, если сервер отправляет другую строку, клиент не может ее получить. Чтобы передавать данные между сервером и клиентом несколько раз, следует ли включать какие-либо функции? Печать второй версии serverdata на стороне клиента не происходит. Ваш сервер начинает прослушивать какой-то порт. Он ждет, пока клиент не подключится, и accept это соединение. Он считывает и записывает несколько данных по клиентскому соединению. А потом? Затем он просто закрывает сокет и выходит из программы. Это не то, что вы намеревались: вы хотите, чтобы сервер начал ждать следующего соединения. Это означает какой-то цикл: каждый раз, когда клиент подключается, мы будем делать наше сообщение: Я рекомендую вам ознакомиться с соответствующими разделами perldoc perlipc , но имейте в виду, что он использует устаревшие передовые методы, поэтому ничего не копируйте напрямую. Если вы используете для чтения сообщения с другого конца, отправитель должен завершить сообщение «\n». Кроме того, вы можете использовать recv (. ), чтобы сообщение не буферизовалось до символа новой строки. Perl и работа с сокетамиИногда возникает необходимость из программы на перле соединиться с другим сервером и передать/принять какую-нибудь информацию. Как правило, возникает необходимость работать с протоколом HTTP, но поняв основные принципы взаимодействия между двумя серверами и прочитав спецификацию интересующего протокола, можно написать программу, работающую практически через любой протокол. Далее мы рассмотрим работу с протоколом HTTP. Данная функция открывает сокет и привязывает его к указателю SOCK. DOMAIN — это коммуникационный домен. Не нужно его путать с доменом сервера с которым мы соединяемся. В нашем случае это будет Internet домен (бывает еще Unix домен) а потому указываем: PF_INET TYPE — это тип сокета. Мы будем использовать SOCK_STREAM — этот тип обеспечивает последовательный, надежный поток байтов. Так же существуют Datagram socket и Raw socket, но о них как-нибудь в другой раз. PROTOCOL — протокол, по которому будет устанавливаться соединение. В нашем случае это tcp поэтому вместо PROTOCOL вставляем следующее: Помимо tcp можно использовать udp, ip и т.д. Функция getprotobyname возвращает название протокола в более удобном для функции socket виде. Когда сокет готов, можно подключаться к конкретному серверу. Для этого нам нужен адрес сервера и порт. Предварительно, необходимо сделать следующее: Теперь все готово и мы можем использовать функцию connect: После соединения с сервером, мы можем передавать и принимать некоторую информацию. Рассмотрим процесс передачи и приема данных, более подробно, на примере соединения с Web-сервером и получения с него некоторого документа. Для отправки сообщения через сокет служит функция send: Вместо 0 может быть один из перечисленных флагов: После окончания сеанса связи, необходимо закрыть сокет, при этом серверу сообщается что сеанс связи закончен. Для закрытия сокета служит функция close, которой необходимо передать дескриптор сокета. Ну и на последок пример рабочего кода. Программа соединяется с сервером www.perl.ru и забирает от туда главную страницу. Если вы попробуете поменять значения переменной $host, то обнаружите, что с некоторых серверов приходит сообщение об ошибке. Всему причиной HTTP протокол и настройки Web-серверов. Более подробно о HTTP читайте в статье «HTTP протокол». А пока о том как с этим бороться. Подставив эту строчку в наш скрипт, мы получим уже более совершенную программу. Так же, некоторые сервера в зависимости от браузера (а вы еще не ощущаете себя им?) показывают разные версии сайтов. Встречается такое крайне редко, но к этому нужно быть готовым. Используйте для них переменную 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 ); print $client «$line1\n»; > # close $client; > close PARENT; close $client; > > exit; >>sub HUNTSMAN< local($SIG Re: работа с сокетами на перле. нужна помошьна странице «добавить коментарий» внизу, под полем ввод, есть выпадающая менюшка так вот выбери в ней «preformated text» |