Salut,
C'est vendredi, et je suis bloqué sur un truc probablement assez trivial.
J'essaie d'utiliser Sys::SigAction pour mettre en place des timeouts corrects dans un programme utilisant des sockets. Le timeout "de base" pose problème sur certains LAN ou le firewall droppe les paquets sans informer la machine source, ce qui fait bloquer le programme.
Ce qui me pose souci a priori, c'est de passer proprement ma socket à la routine définie dans timeout_call
La boucle while est placée dans une routine, la variable $sock est locale et non globale.
Code :
- use constant SOCKET_TIMEOUT => 5;
- use constant SLEEP_TIME => 5;
- use constant MAX_SEND_RETRY => 3;
- ...
- while ( $retry++ <= MAX_SEND_RETRY)
- {
- $sock = IO::Socket::INET->new(
- PeerAddr => $cl_address,
- PeerPort => $port,
- Proto => "tcp",
- Timeout => SOCKET_TIMEOUT) or do
- {
- sleep SLEEP_TIME;
- next;
- };
- timeout_call (SOCKET_TIMEOUT,sub { my $sock = shift ; $sock->send($data_to_send . EOL) ;}, $sock) or do
- {
- sleep SLEEP_TIME;
- next;
- };
- $alarm_sent=1;
- $sock->close();
- }
|
Message édité par ccp6128 le 20-09-2013 à 17:46:42