Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу асинхронно считать текст из хендлов. короче нормально не получаю текст 
:(
    Опции темы
stan777
  Дата 13.4.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Код

#!/home/stan/bin/perl -w
use strict;
use IO::Socket::INET;
use IO::Select;
use IO::Handle;
use Symbol qw(qualify_to_ref);

my @sockets;
my @ready_read;
my @strings;


sub sysreadline(*;$) {

    my($handle, $timeout) = @_;
    $handle = qualify_to_ref($handle, caller( ));
    my $infinitely_patient = (@_ == 1 || $timeout < 0);
    my $start_time = time( );
    my $selector = IO::Select->new( );
    $selector->add($handle);
    my $line = "";
SLEEP:
    until (at_eol($line)) {
        unless ($infinitely_patient) {
            return $line if time( ) > ($start_time + $timeout);
        }
        # sleep only 1 second before checking again
        next SLEEP unless $selector->can_read(1.0);
INPUT_READY:
        while ($selector->can_read(0.0)) {
            my $was_blocking = $handle->blocking(0);
CHAR:       while (sysread($handle, my $nextbyte, 1)) {
                $line .= $nextbyte;
                last CHAR if $nextbyte eq "\n";
            }
            $handle->blocking($was_blocking);
            # if incomplete line, keep trying
            next SLEEP unless at_eol($line);
            last INPUT_READY;
        }
    }
    return $line;
}

sub at_eol($) { $_[0] =~ /\n\z/ }

my $blank = "Accept: */*\n" .
             "Accept-Language: en-us\n" .
             "Accept-Encoding: deflate\n" .
             "User-Agent: Mozilla/4.1 (compatible; MSIE 6.0; Windows 2000)\n\n";

my @sites=(
    'www.perl.com',
    'www.helsinki.ru',
    'www.cpan.org'
);

foreach my $se (@sites){

    my $socket = IO::Socket::INET->new(
            Type=>SOCK_STREAM,
        PeerAddr => $se,
            PeerPort => 80,
        Proto => 'tcp',
            Blocking => 0,               # This line is very important
          Timeout => 20 
        ) or die "socket $@\n";

    push @sockets,$socket;

}                           

my $i=0;

my $select=IO::Select->new;

for (@sockets)
{ 
    #print "mas: $_\n";
    
    print "request $i \n";

    syswrite($sockets[$i], "GET / HTTP/1.0\nHost: $sites[$i]\n".$blank);

    print "select handle $i \n";
    $select->add($sockets[$i]);
    $i++;
}

$i=0;

while(1){
    if (@ready_read=$select->can_read(0)){# вот здесь не знаю как правильно считать строки. 
         while (defined($ready_read[0])){   
        $strings[$i] = sysreadline(pop(@ready_read),20); # читаю получаю билеберду. 
        $i++;                                              
        }
            
    }
    last if $i == scalar(@sockets);
}

print scalar(@strings);
for (@strings)
{
  print $_."\n";
}  
exit 0;

Короче кто знает как правильно читать из кучи не блокирующихся хедлов массива @ready_read? line  93:   if (@ready_read=$select->can_read(0)){ из этого !

Это сообщение отредактировал(а) stan777 - 13.4.2007, 16:45
PM MAIL   Вверх
stan777
Дата 13.4.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Вроде так сделал что-то начало читать, но как бы мне тперь выходить из этого цикла. 

Код

my $line;

while(1)
{
    while(@ready=$select->can_read(0)){

        for (@ready) {
            $line=sysreadline($_);
            print $line;
             }
    }

} 

PM MAIL   Вверх
KSURi
Дата 13.4.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



last добавь после вложенного while


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
stan777
Дата 15.4.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Цитата(KSURi @ 13.4.2007,  19:33)
last добавь после вложенного while

Last, если что smile ? last if ???; Просто не могу сам для себя определить критерий выхода из безусловного цикла.

Это сообщение отредактировал(а) stan777 - 15.4.2007, 21:49
PM MAIL   Вверх
KSURi
Дата 15.4.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Код

my $line;
while(1)
{
    while(@ready=$select->can_read(0)){
        for (@ready) {
            $line=sysreadline($_);
            print $line;
             }
    }
    last;
} 

Когда can_read вернет false - все закончится


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
stan777
Дата 15.4.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Цитата(KSURi @  15.4.2007,  21:54 Найти цитируемый пост)
Когда can_read вернет false - все закончится 

Дело в том что мне can_read() сначала возвращает false, потом начинает возвращать true, но если я там пославлю last то ссоответсвенно выдет сразу, хотя пока я это писал пришла идея перед can_read() поставить sleep(1), хотя задержка в секунду конечно долго.  


Это сообщение отредактировал(а) stan777 - 15.4.2007, 22:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1060 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.