Re: PoCo::Client::Ping intermittently fails to emit pings

Stuart Kendrick <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Message-ID <[email protected]>
i'm walking through .../perl5/site_perl/5.10.0/POE/Component/Client/Ping.pm

where do we emit an error if we are unable to send an ICMP packet?



seems to me that we decide to send the ping in the very last line of 'sub 
poco_ping_ping':

[...]
# Request a ping.  This code borrows heavily from Net::Ping.

sub poco_ping_ping {
[...]
   _send_packet($kernel, $heap);
}


and we actually send the ping on line 362, within the '_send_packet' routine, 
specifically, from the 'send' phrase within the 'unless'  clause:


sub _send_packet {
   my ($kernel, $heap) = @_;
   return unless (scalar @{$heap->{queue}});
[...]
   # Send the packet.  If send() fails, then we bail with an error.
   my @user_args = ();
   ($event, @user_args) = @$event if ref($event) eq "ARRAY";

   DEBUG and warn "sending packet sequence number $seq\n";
   unless (send($heap->{socket_handle}, $msg, ICMP_FLAGS, $socket_address)) {
     $kernel->post(
       $sender, $event,
       [ $address,    # REQ_ADDRESS
         $timeout,    # REQ_TIMEOUT
         time(),      # REQ_TIME
         @user_args,  # REQ_USER_ARGS
       ],
       [ undef,   # RES_ADDRESS
         undef,   # RES_ROUNDTRIP
         time(),  # RES_TIME
         undef,   # RES_TTL
       ],
     );
     _check_for_close($kernel, $heap);
     return;
   }
[...]


now, i see the comment "If send() fails, then we bail with an error".  but i 
don't see where we actually spit out an error message.  seems to me that 
_send_packet returns with a value of 0 (that 'return' statement just after the 
call to _check_for_close) ... but i don't see us checking the return value of 
_send_packet, back in "sub poco_ping_ping"


or ... does the "$kernel-post( ..." event trigger an error message, through some 
mechanism i don't understand?

would it be reasonable for me to add the following, in order to track the 
success/failure of the call to send()  ?

[...]
   unless (send($heap->{socket_handle}, $msg, ICMP_FLAGS, $socket_address)) {
     warn "Unable to send() ICMP packet";
     $kernel->post(
[...]

or would i be duplicating effort performed elsewhere?

actually, what i really want to do is to log such events to syslog, so am i 
headed in a fruitful direction by adding the following?

[...]
   unless (send($heap->{socket_handle}, $msg, ICMP_FLAGS, $socket_address)) {
     use Sys::Syslog;
     openlog('PoCo-Ping', 'nofatal,ndelay,pid', 'local0');
     syslog('error', 'Unable to send() ICMP packet');
     closelog();
     $kernel->post(
[...]


--sk
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.