On Wed, Feb 14, 2007 at 01:28:07PM -0800, Colin Meyer wrote:
[...]
> My other question is about my usage of this method. Is it correct? It
> seems that every time I call $sock->poll(), it returns success,
> indicating that it's ok to write to the socket. But then, when I call
> $sock->send(), it barfs. For this test case, the client is purposely
> closing its socket early.
Erm. I'm not sure why I was expecting ->poll() to block when the socket
was disconnected. Instead, I've added logic to try again or abort, based
on the error (if any) trapped from ->send().
-Colin.
>
> Thanks for any help,
> -Colin.
>
> Code snippet:
>
> SENDING:
> while ( $sent < $total
> && ( $timeleft = $timeout - tv_interval( $starttime ) ) > 0 ) {
> log_stuff( "about to poll with timeleft [$timeleft]" );
> my $rc = $sock->poll(
> $c->pool,
> int( $timeleft * 1_000_000 ), # timeleft is seconds
> APR::Const::POLLOUT
> );
> log_stuff( "poll result: [$rc] [" . APR::Error::strerror( $rc ) . ']'
> );
> if ( $rc == APR::Const::TIMEUP ) {
> $timeleft = -1;
> last SENDING;
> }
> unless ( $rc == APR::Const::SUCCESS ) {
> die "problem while waiting to send results to client: "
> . APR::Error::strerror( $rc );
> }
> my $bytes = eval { $sock->send( substr( $return, $sent, $total ) ) };
- if ( my $err = $@ ) {
- log_stuff( "error while sending return message: [$err]" );
- }
+ if ( my $err = $@ ) {
+ if ( APR::Status::is_EAGAIN( $err ) ) {
+ log_stuff( "got EAGAIN on fileno [$sock->{fileno}]" );
+ next SENDING;
+ }
+ else {
+ log_stuff( "error while sending return message: [$err]" );
+ $socket_error = 1;
+ last SENDING;
+ }
+ }