|
NAMEAPR::Socket - Perl API for APR sockets Synopsis use APR::Socket ();
### set the socket to the blocking mode if it isn't already
### and read in the loop and echo it back
use APR::Const -compile => qw(SO_NONBLOCK);
if ($sock->opt_get(APR::Const::SO_NONBLOCK)) {
$sock->opt_set(APR::Const::SO_NONBLOCK => 0);
}
# read from/write to the socket (w/o handling possible failures)
my $wanted = 1024;
while ($sock->recv(my $buff, $wanted)) {
$sock->send($buff);
}
### get/set IO timeout and try to read some data
use APR::Const -compile => qw(TIMEUP);
# timeout is in usecs!
my $timeout = $sock->timeout_get();
if ($timeout < 10_000_000) {
$sock->timeout_set(20_000_000); # 20 secs
}
# now read, while handling timeouts
my $wanted = 1024;
my $buff;
my $rlen = eval { $sock->recv($buff, $wanted) };
if ($@ && ref $@ && $@ == APR::Const::TIMEUP) {
# timeout, do something, e.g.
warn "timed out, will try again later";
}
else {
warn "asked for $wanted bytes, read $rlen bytes\n";
# do something with the data
}
# non-blocking io poll
$sock->opt_set(APR::Const::SO_NONBLOCK => 1);
my $rc = $sock->poll($c->pool, 1_000_000, APR::Const::POLLIN);
if ($rc == APR::Const::SUCCESS) {
# read the data
}
else {
# handle the condition
}
# fetch the operating level socket
my $fd=$sock->fileno;
Description"APR::Socket" provides the Perl interface to APR sockets. API"APR::Socket" provides the following methods: "fileno"Get the operating system socket, the file descriptor on UNIX. $fd = $sock->fileno;
"opt_get"Query socket options for the specified socket $val = $sock->opt_get($opt);
Examples can be found in the socket options constants section. For example setting the IO to the blocking mode. "opt_set"Setup socket options for the specified socket $sock->opt_set($opt, $val);
Examples can be found in the socket options constants section. For example setting the IO to the blocking mode. "poll"Poll the socket for events: $rc = $sock->poll($pool, $timeout, $events);
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::Const::SO_NONBLOCK => 1);
my $rc = $sock->poll($c->pool, 1_000_000, APR::Const::POLLIN);
if ($rc == APR::Const::SUCCESS) {
# Data is waiting on the socket to be read.
# $sock->recv(my $buf, BUFF_LEN)
}
elsif ($rc == APR::Const::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);
}
"recv"Read incoming data from the socket $len = $sock->recv($buffer, $wanted);
Here is the quick prototype example, which doesn't handle any errors (mod_perl will do that for you): use APR::Socket ();
# set the socket to the blocking mode if it isn't already
use APR::Const -compile => qw(SO_NONBLOCK);
if ($sock->opt_get(APR::Const::SO_NONBLOCK)) {
$sock->opt_set(APR::Const::SO_NONBLOCK => 0);
}
# read from/write to the socket (w/o handling possible failures)
my $wanted = 1024;
while ($sock->recv(my $buffer, $wanted)) {
$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::Const::ECONNABORTED) {
# ignore
last;
}
else {
die $@; # retrow
}
}
if ($len) {
$sock->send($buffer);
}
else {
last;
}
}
"send"Write data to the socket $wlen = $sock->send($buf, $opt_len);
For examples see the "recv" item. "timeout_get"Get socket timeout settings $usecs = $sock->timeout_get();
"timeout_set"Setup socket timeout. $sock->timeout_set($usecs);
Unsupported API"APR::Socket" also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the the mod_perl development mailing list so we can help each other take the steps necessary to shift the method to an officially supported API. "bind"META: Autogenerated - needs to be reviewed/completed Bind the socket to its associated port $ret = $sock->bind($sa);
This may be where we will find out if there is any other process using the selected port. "close"META: Autogenerated - needs to be reviewed/completed Close a socket. $ret = $sock->close();
"connect"META: Autogenerated - needs to be reviewed/completed Issue a connection request to a socket either on the same machine or a different one. $ret = $sock->connect($sa);
"listen"META: Autogenerated - needs to be reviewed/completed Listen to a bound socket for connections. $ret = $sock->listen($backlog);
"recvfrom"META: Autogenerated - needs to be reviewed/completed $ret = $from->recvfrom($sock, $flags, $buf, $len);
"sendto"META: Autogenerated - needs to be reviewed/completed $ret = $sock->sendto($where, $flags, $buf, $len);
See Alsomod_perl 2.0 documentation. Copyrightmod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. AuthorsThe mod_perl development team and numerous contributors.
|