You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Hideki Noma <no...@humeia.ad.jp> on 2002/08/08 04:55:48 UTC

How to detect data avaliability on ARP::Socket

I am currently developping a private module utilizing
PerlProcessConnection handler and facing a bit of problem.
(Apache::2.0.39 + mod_perl 1.99.04)

This is the part of program:
sub handler {
     my Apache::Connection $c = shift;
     my APR::Socket $socket = $c->client_socket;

     my($rlen, $wlen);
     my $rlen = BUFF_LEN;
     $socket->recv($buff, $rlen);

At this point, if there is no incoming data from client,
the program halts forever.

What I want to do is something like
  my $sel = IO::Select->new($socket);
  if ($sel->can_read(1)){
    my $socket->recv($buff, $rlen);
  }
so that I can do other works while waiting for data.

I tried to set timeout using $socket->setsocketopt(APR_SO_TIMEOUT,1)
but it didn't seem to work well.

Does any body have any idea on how to check incoming data avaliabily
on APR::Socket?

Hideki Noma
Humeia Limited Parnership

Re: How to detect data avaliability on ARP::Socket

Posted by Stas Bekman <st...@stason.org>.
Hideki Noma wrote:
> I am currently developping a private module utilizing
> PerlProcessConnection handler and facing a bit of problem.
> (Apache::2.0.39 + mod_perl 1.99.04)
> 
> This is the part of program:
> sub handler {
>      my Apache::Connection $c = shift;
>      my APR::Socket $socket = $c->client_socket;
> 
>      my($rlen, $wlen);
>      my $rlen = BUFF_LEN;
>      $socket->recv($buff, $rlen);
> 
> At this point, if there is no incoming data from client,
> the program halts forever.
> 
> What I want to do is something like
>   my $sel = IO::Select->new($socket);
>   if ($sel->can_read(1)){
>     my $socket->recv($buff, $rlen);
>   }
> so that I can do other works while waiting for data.
> 
> I tried to set timeout using $socket->setsocketopt(APR_SO_TIMEOUT,1)
> but it didn't seem to work well.
> 
> Does any body have any idea on how to check incoming data avaliabily
> on APR::Socket?

According to the apr/include/apr_network_io.h doc, you should be using 
$socket->timeout_set($timeout), before reading from the socket. so the 
recv() will return either with the data read or after the timeout, 
providing the non-blocking mechanism.

Though, this API seems to be a recent thing and it's not supported by 
mod_perl, yet. I suppose that it'll be supported in the next release (or 
the cvs version. watch the dev list, where I've just posted the patch)



__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com