Автор Тема: Perl. IO::Select разница между win/bsd  (Прочитано 2225 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн maxgromov

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 1
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Perl. IO::Select разница между win/bsd
« : 05 Апреля 2007, 19:29:09 »
Есть небольшой кусок кода, который разом проверяет набор IP адресов на "живучесть":

my (@addr, $sAddr, $sPort, @socks, $s);
@addr = (\'127.0.0.1:8888\',\'127.0.0.1:8887\',\'127.0.0.1:8886\',\'127.0.0.1:8885\',\'127.0.0.1:8884\',\'87.250.251.8:80\');

$s = IO::Select->new;
foreach my $address (@addr) {
  push(@socks, IO::Socket::INET->new(Proto => \'tcp\', Type => SOCK_STREAM));
  $socks[$#socks]->blocking(0);
  if ($address=~/(.+):(.+)/i) {
    ($sAddr, $sPort) = ($1,$2);
    my $addr = sockaddr_in($sPort,inet_aton($sAddr));
    $socks[$#socks]->connect($addr);
    $s->add($socks[$#socks]);
  }
}

if (my @tmp =  $s->can_write(5)) {
  foreach (@tmp) {
     my ($a,$b) = ($_->peerhost,$_->peerport);
     print "Good One: $a:$b!\\n";
     $_->close;
  }
}

Он прекрасно работает под виндой определяя единственный живой адрес (последний в массиве), но при попытке выполнить тот же код под fbsd массив @tmp заполняется всеми остальными, кроме нужного адреса.. Т.е. работает как-то не логично.  Почему так и как заставить работать правильно?  :(

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28