The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Perl + IO::Select: почему под win работает, а под bsd нет?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Perl + IO::Select: почему под win работает, а под bsd нет?"  
Сообщение от maxgromov (ok) on 06-Апр-07, 00:41 
Есть небольшой кусок кода, который разом проверяет набор IP адресов на "живучесть":

my (@addr, @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) {
    my $addr = sockaddr_in($2,inet_aton($1));
    $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 заполняется всеми остальными, кроме нужного адреса..  Почему так и как заставить работать правильно?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Perl + IO::Select: почему под win работает, а под bsd нет?"  
Сообщение от ACCA (ok) on 06-Апр-07, 01:43 
>но при попытке выполнить тот же код под fbsd массив @tmp
>заполняется всеми остальными, кроме нужного адреса..  Почему так и как
>заставить работать правильно?

Подозреваю, что "нужный" - это порт 80 на удалённом сервере. Возможно connect ещё не прошёл, нужно подождать. Возможные решения:

1. blocking(1), осмысленный Timeout и потом connect
2. вместо if (my @tmp... сделать цикл, проверяя $->can_write(TIMEOUT) и делая $s->remove
   тех, кто уже отозвался. !$s->handles - все доступны, @tmp пустой - прошёл TIMEOUT,
   остальные не отозвались

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру