1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Ограничение ожидание ответа сервера при подключении через Socket (Perl)

Тема в разделе "Софт", создана пользователем Nekto, 09.09.04.

  1. Nekto

    Nekto Почётный

    5.712
    0
    Я делаю сокетами запрос через прокси.
    Суть в том, что часто прокся просто умирает и скрипт "зависает", так как не получает ответа от прокси.
    Как сделать так, что бы ограничить время ожидания ответа сервера серез проксю секудны в 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.
     
  2. luka

    luka Активный участник

    704
    0
    my $sock = IO::Socket::INET->new(..., Timeout => 2, ...);
     
  3. paraNoId

    paraNoId Участник

    236
    0
    или неблокирующий сокет и таймаут в селекте.
     
  4. luka

    luka Активный участник

    704
    0
    Зачем изобретать велосипед, если существует готовое стандартное решение?
     
  5. paraNoId

    paraNoId Участник

    236
    0
    Я-то откуда знаю - зачем? Мне в голову пришло два способа, один ты уже написал. Я показал второй.
    Угу. Я б, например, еще "стандартней" сделал:

    $ua = LWP::UserAgent->new;
    $ud->agent('Mozilla/42.0 (compatible; MSIE 28.0; Win128)');
    $ua->proxy('http://proxy:port/');
    $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 "(_|_)";
    };

    Видимо, не подходит спрашивающему "готовое стандартное решение" . Он, вообще, через сокеты читает. Наверно, есть причины. Такшта, знать другие варианты - не помешает.
     
  6. Nekto

    Nekto Почётный

    5.712
    0
    paraNoId
    Мне не к чему использовать метод передачи данных POST
    Я работаю через анонимные прокси. (LWP в варианте, установленном у хостера не позволяет этого делать. Оттого и сокеты).
    Я подменяю HTTP заголовки.
    luka
    Обратите внимание на синтаксис, который я использую, всвязи с подключением через проксю. При подключении через проксю указанных вариант создания сокета не прокатит.
     
  7. paraNoId

    paraNoId Участник

    236
    0

    Ну, пусть будет гет ;) Какая разница в, данном случае. Так же выставляются нужные заголовки. Так же передаются.
    С этим ХЗ. С анонимными проксями дела не имел (не, что это технически - я знаю), и как в LWP отрывается их поддержка я не представляю. Хостер правил LWP?
    Такшта, если сокеты, то либо $SIG{ALRM}, либо таймаут в селекте. И помнить при этом:
    :D
     
  8. luka

    luka Активный участник

    704
    0
    Net::HTTP::NB - Non-blocking HTTP client

    (та идея, которую высказал paraNoId)