[Moscow.pm] check Socket Alive

Ruslan Zakirov ruslan.zakirov на gmail.com
Пт Ноя 20 03:32:28 PST 2009


eval {...};

if (my $err = $@ ) {
  if ( $tries++<3 && $err =~ /^alarm time out\b/ ) {
     reconnect(...);
     goto PRE_EVAL_LABEL;
  } else {
     die "failed to get: $err";
  }
}

как-то так, и еще возможно $SIG{'PIPE'} хендлить.

2009/11/20 Kaltashkin Eugene <zhecka на gmail.com>:
> Доброе время суток.
>
> Помню где-то пролетало, но найти не могу.
> Есть Unix Socket Client который дёргает данные из другого процесса.
> Иногда слушающий процесс падает. Соответственно падает клиент.
> Как бы сделать чтобы  клиент не падал ?
> Пытаться заново создать клиента к сокету ?
> Понятное дело, что нужно что-то сделать в local $SIG{ALRM}, но вот что ?
>
> Схема вот такая.
> my $client = IO::Socket::UNIX->new(     Peer  => $socketfile,
>                                       Type      => SOCK_STREAM ) or die $!;
> print $client $string;
> eval {
>   local $SIG{ALRM} = sub { die "alarm time out" };
>   alarm 2;
>   my $lens = sysread($client,$line,1024);
>   ......
>   alarm 0;
>   return "$catnumlist $categlist\n";
>   1;  # return value from eval on normalcy
> } or die "recv from socket fail after 2 seconds.\n";
>
> Что лучше сделать ? Это поточный демон(аналог socat), снимающий запросы с
> UDP и перенаправляющий на UnixSocket, и потом обратно.
> Поток доходит до 200 запросов в секунду. Слушающий UDP сокет работает через
> IO::Multiplex.
> Подскажите плз кто похожие схемы делал.
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm