Сокеты


Примеры

Подгружение файлов на несколько серверов через веб-страничку

Предположим Вы работаете менеджером по рекламе и вам необходимо подгружать один баннер в десяток другой баннерных систем. Чтобы не возится с каждым баннером, можно написать программу, автоматизирующую процесс подгрузки баннеров на несколько сайтов, защищенных паролем в хидден-поле(безопасность для данного примера работает при клиенте с аутентификацией через хидден-поля). Используя встроенную упаковку CGI.pm пакетов multipart/from можно напороться на то, что CGI.pm формируетй такой пакет, который может не разобрать программа, написанная, скажем на языке C. Т.е. CGI.pm формирует пакеты не совсем согласно rfc1867. Чтобы избежать этого неудобства, можно посылать картинки, используя Socket.pm. Т.е. нужно сформировать и отправить пакет в точности с rfc1867, который является стандартом для всех языков программирования. Ниже представлена программа, реализующая эту задачу: #!/usr/bin/perl -w if ((!defined $ARGV[0]) || ($ARGV[0] =~ /^-h/i)) { print << '__HELP_END__'; This script sends banners to www.kuku.ru. Usage: ./set_banner.pl <image_filename> __HELP_END__ exit(1); } my $filename = shift @ARGV; my %accounts = ( 'vovka' => ['123321', 13] ); my ($login, $data); while (($login,$data) = each %accounts) { my %params = ( image_filename => $filename, login => $login, password => $data->[0], profile => $data->[1] ); #print join ":", %params; send_banner_to_kuku_ru(%params); } exit(0); sub send_banner_to_kuku_ru(%) { my %params = @_; open FILE, $params{image_filename} or die "Can't open imagefile: $!"; binmode(FILE); my $image_data = <FILE>; close FILE; %params = (%params, ( host => 'www.kuku.ru', script_uri => 'account/addimage.html', url => 'www.rrrr.ru', image_data => $image_data, ratio => '0', alt => 'Новости на www.rrrr.ru' )); use IO::Socket; my $socket = IO::Socket::INET->new( PeerAddr => $params{host}, PeerPort => 80, Proto => 'tcp' ) or die "Can't connect: $!"; my $body = ''. << "__END_OF_BODY__"; -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="user" $params{login} -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="password" $params{password} -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="image"; filename="$params{image_filename}" Content-Type: image/gif Content-Transfer-Encoding: binary $params{image_data} -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="href" $params{url} -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="profile" $params{profile} -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="ratio" $params{ratio} -----------------------------7d02d3301bfa0846 Content-Disposition: form-data; name="alt" $params{alt} __END_OF_BODY__ $body .= '-----------------------------7d02d3301bfa0846--'; my $content_length = length($body); my $header = '' . << "__END_OF_HEADER__"; POST $params{script_uri} HTTP/1.1 Accept: */* Accept-Language: ru User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) Content-Length: $content_length Content-Type: multipart/form-data; boundary=---------------------------7d02d3301bfa0846 Host: $params{host} __END_OF_HEADER__ print $header . "\n" . $body; print $socket $header . "\n\n" . $body; while (<$socket>) { print; } close $socket; } 1; Скрипт написан Максимом Дуниным