rendler has asked for the wisdom of the Perl Monks concerning the following question:

Here's the little bit of code that is the issue
sub send_rcon { my ($server, $port, $password, $command, %message_info) = @_; my $incoming; use IO::Socket; my $socket = IO::Socket::INET->new(PeerAddr => $server, PeerPort => $port, Proto => 'udp') or return "rcon: socket error [ +$!]."; if ($socket) { $socket->send(chr(255)x4 . "rcon $password $command") or return "r +con: send error [$!]."; $SIG{ALRM} = sub { scm($message_info{'irc_chan'}, "rcon: timed out +.", $message_info{'kernel'}); }; eval { alarm (5); sysread($socket, $incoming, 1024) or return "rcon: return erro +r [$1]."; alarm (0); close $socket; }; } return $incoming; }
I went to test the timeout by specifying the ip address of 10.0.0.1 and port of 275001, on my machine it does as intended and sends the timeout message to the channel but once ran from another machine the irc bot just freezes and the process has to be killed and restarted again, but I've had it working successfully once on the other machine and the other 9 times I've tried just resulted in it being frozen. Any explanations as to what could be causing this?

Replies are listed 'Best First'.
Re: Alarm not working across systems
by clintp (Curate) on Mar 07, 2002 at 00:05 UTC
    Yuck. The rule with signal handling (at least for now) is: do as little as possible in the handler and get out. The best thing to do is to change the value of an already initialized package variable -- not a my'd variable -- from 0 to 1 to indicate that the alarm did indeed go off and was caught. After the eval {} block check the value of the flag and proceed appropriately.
Re: Alarm not working across systems
by BeernuT (Pilgrim) on Mar 07, 2002 at 00:06 UTC
    you open up by saying:

    Alarm not working across systems

    What systems are you talking about? As in what version of OS and perl are you using? Some os's do not support alarm and could be one of your problems.

    -bn
      Both are Linux 2.4.X (mdk, deb) and both have perl 5.6.1, and basically the same version of modules used. Also the system is capable of doing it, because it did it that one time then stopped working for some unknown reason and the code wasn't changed one single line between runs.
Re: Alarm not working across systems
by particle (Vicar) on Mar 07, 2002 at 14:51 UTC
    signal handling in perl is marginal. and flaky. i either use sigtrap; (the sigtrap pragma,) or if that fails, roll my own. in that case, i always set my handlers recursively, like so:

    sub hdl_ALRM { $SIG{ALRM} = \&hdl_ALRM; # do stuff here... } $SIG{ALRM} = \&hdl_ALRM;
    best of luck!

    ~Particle ;Þ