Всем привет!
Пытаюсь написать на Перле скриптик
open (PINGTEST, "/bin/ping 192.168.0.1 |");
my $ping = new IO::Handle;
$ping->fdopen(fileno(PINGTEST),"r");
my $stream = IO::Async::Stream->new(
handle => $ping,
autoflush => 1,
on_read => sub {
my ( $self, $buffref, $closed ) = @_;
print $$buffref;
return 0;
}
);
$timer->start;
$loop->add( $stream );
$loop->loop_forever()
должен по задумке выводить на экран результат работы пинг.
Он и выводит только вот так:
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.069 ms
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.054 ms
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.052 ms
Почему так?
Здравствуйте, Spider84, Вы писали:
S>должен по задумке выводить на экран результат работы пинг.
S>Он и выводит только вот так:
S>PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
S>64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.069 ms
S>PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
S>64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.069 ms
S>64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.054 ms
S>PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
S>64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.069 ms
S>64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.054 ms
S>64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.052 ms
S>Почему так?
Потому что буфер не чистите.
Асинхронные обработчики такого рода могут проектироваться так, что управляющий слой накапливает данные в буфере, а клиентский обработчик просто проверяет буфер и смотрит, есть ли полное сообщение для обработки. Если есть — выбирает его и не забывает очистить. Вы — забываете.