Я делаю сокетами запрос через прокси. Суть в том, что часто прокся просто умирает и скрипт "зависает", так как не получает ответа от прокси. Как сделать так, что бы ограничить время ожидания ответа сервера серез проксю секудны в 2? Грубо говоря нужно сделать такое условие: if (сервер выдал ответ через прокси в виде заголовков и html кода страницы в течении 2 секунд с момента отправки запроса) { одно действие } else { другое действие } Вот код подключения к проксе и отправка запроса через нее к серверу: use Socket; $site="www.site.ru"; $cur='/page.html'; $AF_INET=2; $SOCK_STREAM=1; $protocol=(getprotobyname('tcp'))[2]; $end="\015\012"; $u=0; $proxy="прокся"; $port="порт"; $addr=(gethostbyname($proxy))[4]; $addrs=pack ('S n a4 x8', $AF_INET, $port, $addr); { if (!(socket(LOAD,$AF_INET,SOCK_STREAM,$protocol))) { print "Невозможно создать сокет на прокси: $proxy\:$port "; } if (!(connect(LOAD, $addrs))) { # print "Ошибка подключения"; } select(LOAD); $|=1; select(STDOUT); print LOAD "GET http://$site$cur HTTP/1.0$end"; print LOAD "Content-Type:application/x-www-form-urlencoded$end"; print LOAD "Accept: text/html$end"; print LOAD "Accept: image/jpeg$end"; print LOAD "User-Agent: $user$end"; print LOAD "Accept: image/gif$end"; print LOAD "Accept: image/x-xbitmap$end"; print LOAD "Referer: $refer/$end"; print LOAD "Accept: image/pjpeg$end"; print LOAD "Authorization: Basic $encoded$end"; print LOAD "$end$end"; @str=<LOAD>; close (LOAD); } Разбираем плученный ответ сервера в массиве @str.
Я-то откуда знаю - зачем? Мне в голову пришло два способа, один ты уже написал. Я показал второй. Угу. Я б, например, еще "стандартней" сделал: $ua = LWP::UserAgent->new; $ud->agent('Mozilla/42.0 (compatible; MSIE 28.0; Win128)'); $ua->proxy('http://proxyort/'); $ua->timeout(2); ## Сюда внимание обрати $req = HTTP::Request->new(POST => 'http:/$site$cur'); $req->content_type('application/x-www-form-urlencoded'); $req->header('Accept' => 'text/html'); .... плюс остальные хидеры $res = $ua->request($req); if($res->is_success){ print $res->content; } else { print "(_|_)"; }; Видимо, не подходит спрашивающему "готовое стандартное решение" . Он, вообще, через сокеты читает. Наверно, есть причины. Такшта, знать другие варианты - не помешает.
paraNoId Мне не к чему использовать метод передачи данных POST Я работаю через анонимные прокси. (LWP в варианте, установленном у хостера не позволяет этого делать. Оттого и сокеты). Я подменяю HTTP заголовки. luka Обратите внимание на синтаксис, который я использую, всвязи с подключением через проксю. При подключении через проксю указанных вариант создания сокета не прокатит.
Ну, пусть будет гет Какая разница в, данном случае. Так же выставляются нужные заголовки. Так же передаются. С этим ХЗ. С анонимными проксями дела не имел (не, что это технически - я знаю), и как в LWP отрывается их поддержка я не представляю. Хостер правил LWP? Такшта, если сокеты, то либо $SIG{ALRM}, либо таймаут в селекте. И помнить при этом: :D