stas        2004/09/07 17:44:38

  Modified:    src/docs/2.0/api/APR Socket.pod
  Log:
  new api: poll()
  Submitted by: Ken Simpson <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.13      +131 -2    modperl-docs/src/docs/2.0/api/APR/Socket.pod
  
  Index: Socket.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/APR/Socket.pod,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -u -r1.12 -r1.13
  --- Socket.pod        18 Aug 2004 01:39:32 -0000      1.12
  +++ Socket.pod        8 Sep 2004 00:44:38 -0000       1.13
  @@ -41,6 +41,17 @@
         # do something with the data
     }
   
  +  # non-blocking io poll
  +  $sock->opt_set(APR::SO_NONBLOCK => 1);
  +  my $rc = $sock->poll($c->pool, 1_000_000, APR::POLLIN);
  +  if ($rc == APR::SUCCESS) {
  +      # read the data
  +  }
  +  else {
  +      # handle the condition
  +  }
  +
  +
   
   =head1 Description
   
  @@ -140,6 +151,84 @@
   
   
   
  +=head2 C<poll>
  +
  +Poll the socket for events:
  +
  +    $rc = $sock->poll($pool, $timeout, $events);
  +
  +=over 4
  +
  +=item obj: C<$sock>
  +( C<L<APR::Socket object|docs::2.0::api::APR::Socket>> )
  +
  +The socket to poll
  +
  +=item arg1: C<$pool>
  +( C<L<APR::Pool object|docs::2.0::api::APR::Pool>> )
  +
  +usually C<L<$c-E<gt>pool|docs::2.0::api::Apache::Connection/C_pool_>>.
  +
  +=item arg2: C<$timeout> ( integer )
  +
  +The amount of time to wait (in milliseconds) for the specified events
  +to occur.
  +
  +=item arg3: C<$events> ( C<L<APR::Const :poll
  +constants|docs::2.0::api::APR::Const/C__poll_>> )
  +
  +The events for which to wait.
  +
  +For example use
  +C<L<APR::POLLIN|docs::2.0::api::APR::Const/C_APR__POLLIN_>> to wait
  +for incoming data to be available,
  +C<L<APR::POLLOUT|docs::2.0::api::APR::Const/C_APR__POLLOUT_>> to wait
  +until it's possible to write data to the socket and
  +C<L<APR::POLLPRI|docs::2.0::api::APR::Const/C_APR__POLLPRI_>> to wait
  +for priority data to become available.
  +
  +=item ret: C<$rc>
  +( C<L<APR::Const constant|docs::2.0::api::APR::Const>> )
  +
  +If C<APR::SUCCESS> is received than the polling was successful. If not
  +-- the error code is returned, which can be converted to the error
  +string with help of
  +C<L<APR::Error::strerror|docs::2.0::api::APR::Error/C_strerror_>>.
  +
  +=item since: 1.99_17
  +
  +=back
  +
  +For example poll a non-blocking socket up to 1 second when reading
  +data from the client:
  +
  +  use APR::Socket ();
  +  use APR::Connection ();
  +  use APR::Error ();
  +  
  +  use APR::Const -compile => qw(SO_NONBLOCK POLLIN SUCCESS TIMEUP);
  +  
  +  $sock->opt_set(APR::SO_NONBLOCK => 1);
  +  
  +  my $rc = $sock->poll($c->pool, 1_000_000, APR::POLLIN);
  +  if ($rc == APR::SUCCESS) {
  +      # Data is waiting on the socket to be read.
  +      # $sock->recv(my $buf, BUFF_LEN)
  +  }
  +  elsif ($rc == APR::TIMEUP) {
  +      # One second elapsed and still there is no data waiting to be
  +      # read. for example could try again.
  +  }
  +  else {
  +      die "poll error: " . APR::Error::strerror($rc);
  +  }
  +
  +
  +
  +
  +
  +
  +
   
   
   =head2 C<recv>
  @@ -189,11 +278,27 @@
         # timeout, do something, e.g.
     }
   
  +If not handled -- you may get the error C<'70007: The timeout
  +specified has expired'>.
  +
  +Another error condition that may occur is the C<'(104) Connection
  +reset by peer'> error, which is up to your application logic to decide
  +whether it's an error or not. This error usually happens when the
  +client aborts the connection.
  +
  +  use APR::Const -compile => qw(ECONNABORTED);
  +  my $buffer;
  +  eval { $sock->recv($buffer, $wanted) };
  +  if ($@ == APR::ECONNABORTED) {
  +      # ignore it or deal with it
  +  }
  +
   =item since: 1.99_14
   
   =back
   
  -Examples:
  +Here is the quick prototype example, which doesn't handle any errors
  +(mod_perl will do that for you):
   
     use APR::Socket ();
     
  @@ -208,8 +313,32 @@
         $sock->send($buffer);
     }
   
  +If you want to handle errors by yourself, the loop may look like:
   
  -
  +  use APR::Const -compile => qw(ECONNABORTED);
  +  # ...
  +  while (1) {
  +      my $buf;
  +      my $len = eval { $sock->recv($buf, $wanted) };
  +      if ($@) {
  +          # handle the error, e.g. to ignore aborted connections but
  +          # rethrow any other errors:
  +          if ($@ == APR::ECONNABORTED) {
  +              # ignore
  +              last;
  +          }
  +          else {
  +              die $@; # retrow
  +          }
  +      }
  +  
  +      if ($len) {
  +          $sock->send($buffer);
  +      }
  +      else {
  +          last;
  +      }
  +  }
   
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to