[Moscow.pm] check Socket Alive

Kaltashkin Eugene zhecka на gmail.com
Пт Ноя 20 00:58:18 PST 2009


Доброе время суток.

Помню где-то пролетало, но найти не могу.
Есть 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