http://www.perlmonks.org?node_id=1038813


in reply to Checking if a socket has some data to read

You could start by reviewing this: Check network MTU size

It uses code that I stole from Net::Ping and another node from here in the monastery, but definitely uses non-blocking calls, and does actually read some data "off the wire".

-Scott

  • Comment on Re: Checking if a socket has some data to read

Replies are listed 'Best First'.
Re^2: Checking if a socket has some data to read
by perlgsm (Initiate) on Jun 14, 2013 at 12:28 UTC
    Thanks Scott, for the script. but I seem to be doing it the same way, for I always get undef from can_read() even if there is some data available on the wire.
      Hmm, no, I think you're confusing can_read with the routine that actually does the reading, you're confusing a scalar variable with an array, and I can't tell if you've turned buffering off on the $lsn file handle, but I'm guessing not.

      Your code:

      $results = $sel->can_read(0);# or die "cant read"; #print Dumper @results; print "\n****Outside if****"; print "results== $results\n";

      Ping code:

      if ( $select -> can_read( 0 ) ) { my $remote = recv ( $pinger, $buff, SIZE, RCV_FLAGS ); if ( $debug ) { print "result from ", unpack("C*",$remote), ":", unpack ( "C*", $target_addr), "\n"; } # sometimes ICMP replies come from other devices, filter those out if ( $remote eq $target_addr ) { $received++; } }

      So, you've, at best, got a boolean result from the can_read, but then you use that as if can_read returned an array of data from the wire, rather than use a recv() call to actually read the data properly.

      I'm also betting that you're Suffering from Buffering, which means unless you've tested by sending tons of stuff, the buffer never filled up, and it *LOOKS* like you've not received anything.

      -Scott

        Thank you Scott and my apologies for the late reply. I will read this today or next week and try to implement your suggestions. You may be right I may be suffering from buffering. Receiving some data is the only piece not working in my script and stopping it from becoming, what I want. I will get back to you. Kind regards. Cheers!
        God bless world peace...