GIF89a; %PDF-1.5 %���� ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY
Server IP : 134.29.175.74 / Your IP : 216.73.216.160 Web Server : nginx/1.10.2 System : Windows NT CST-WEBSERVER 10.0 build 19045 (Windows 10) i586 User : Administrator ( 0) PHP Version : 7.1.0 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /nginx/html/JimMartinson/CST1611/VM_Data/Install/ApachePerlFiles/Perl/html/site/lib/APR/ |
Upload File : |
<?xml version="1.0" ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <!-- saved from url=(0017)http://localhost/ --> <script language="JavaScript" src="../../../displayToc.js"></script> <script language="JavaScript" src="../../../tocParas.js"></script> <script language="JavaScript" src="../../../tocTab.js"></script> <link rel="stylesheet" type="text/css" href="../../../scineplex.css"> <title>APR::Socket - Perl API for APR sockets</title> <link rel="stylesheet" href="../../../Active.css" type="text/css" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <link rev="made" href="mailto:" /> </head> <body> <!-- INDEX BEGIN --> <div name="index"> <script>writelinks('__top__',3);</script> <h1><a>APR::Socket - Perl API for APR sockets</a></h1> <p><a name="__index__"></a></p> <ul> <li><a href="#name">NAME</a></li> <li><a href="#synopsis">Synopsis</a></li> <li><a href="#description">Description</a></li> <li><a href="#api">API</a></li> <ul> <li><a href="#opt_get"><code>opt_get</code></a></li> <li><a href="#opt_set"><code>opt_set</code></a></li> <li><a href="#poll"><code>poll</code></a></li> <li><a href="#recv"><a href="../../../lib/pods/perlfunc.html#recv"><code>recv</code></a></a></li> <li><a href="#send"><a href="../../../lib/pods/perlfunc.html#send"><code>send</code></a></a></li> <li><a href="#timeout_get"><code>timeout_get</code></a></li> <li><a href="#timeout_set"><code>timeout_set</code></a></li> </ul> <li><a href="#unsupported_api">Unsupported API</a></li> <ul> <li><a href="#bind"><a href="../../../lib/pods/perlfunc.html#bind"><code>bind</code></a></a></li> <li><a href="#close"><a href="../../../lib/pods/perlfunc.html#close"><code>close</code></a></a></li> <li><a href="#connect"><a href="../../../lib/pods/perlfunc.html#connect"><code>connect</code></a></a></li> <li><a href="#listen"><a href="../../../lib/pods/perlfunc.html#listen"><code>listen</code></a></a></li> <li><a href="#recvfrom"><code>recvfrom</code></a></li> <li><a href="#sendto"><code>sendto</code></a></li> </ul> <li><a href="#see_also">See Also</a></li> <li><a href="#copyright">Copyright</a></li> <li><a href="#authors">Authors</a></li> </ul> <hr name="index" /> </div> <!-- INDEX END --> <p> </p> <h1><a name="name">NAME</a></h1> <p>APR::Socket - Perl API for APR sockets</p> <p> </p> <hr /> <h1><a name="synopsis">Synopsis</a></h1> <pre> <span class="keyword">use</span> <span class="variable">APR::Socket</span> <span class="operator">();</span> <span class="comment">### set the socket to the blocking mode if it isn't already</span> <span class="comment">### and read in the loop and echo it back</span> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(SO_NONBLOCK)</span><span class="operator">;</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_get</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span><span class="operator">))</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=></span> <span class="number">0</span><span class="operator">);</span> <span class="operator">}</span> <span class="comment"># read from/write to the socket (w/o handling possible failures)</span> <span class="keyword">my</span> <span class="variable">$wanted</span> <span class="operator">=</span> <span class="number">1024</span><span class="operator">;</span> <span class="keyword">while</span> <span class="operator">(</span><span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="keyword">my</span> <span class="variable">$buff</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">))</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">send</span><span class="operator">(</span><span class="variable">$buff</span><span class="operator">);</span> <span class="operator">}</span> </pre> <pre> <span class="comment">### get/set IO timeout and try to read some data</span> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(TIMEUP)</span><span class="operator">;</span> <span class="comment"># timeout is in usecs!</span> <span class="keyword">my</span> <span class="variable">$timeout</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">timeout_get</span><span class="operator">();</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$timeout</span> <span class="operator"><</span> <span class="number">10_000_000</span><span class="operator">)</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">timeout_set</span><span class="operator">(</span><span class="number">20_000_000</span><span class="operator">);</span> <span class="comment"># 20 secs</span> <span class="operator">}</span> <span class="comment"># now read, while handling timeouts</span> <span class="keyword">my</span> <span class="variable">$wanted</span> <span class="operator">=</span> <span class="number">1024</span><span class="operator">;</span> <span class="keyword">my</span> <span class="variable">$buff</span><span class="operator">;</span> <span class="keyword">my</span> <span class="variable">$rlen</span> <span class="operator">=</span> <span class="keyword">eval</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="variable">$buff</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">)</span> <span class="operator">};</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$@</span> <span class="operator">&&</span> <span class="keyword">ref</span> <span class="variable">$@</span> <span class="operator">&&</span> <span class="variable">$@</span> <span class="operator">==</span> <span class="variable">APR::Const::TIMEUP</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># timeout, do something, e.g.</span> <span class="keyword">warn</span> <span class="string">"timed out, will try again later"</span><span class="operator">;</span> <span class="operator">}</span> <span class="keyword">else</span> <span class="operator">{</span> <span class="keyword">warn</span> <span class="string">"asked for </span><span class="variable">$wanted</span><span class="string"> bytes, read </span><span class="variable">$rlen</span><span class="string"> bytes\n"</span><span class="operator">;</span> <span class="comment"># do something with the data</span> <span class="operator">}</span> </pre> <pre> <span class="comment"># non-blocking io poll</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=></span> <span class="number">1</span><span class="operator">);</span> <span class="keyword">my</span> <span class="variable">$rc</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">poll</span><span class="operator">(</span><span class="variable">$c</span><span class="operator">-></span><span class="variable">pool</span><span class="operator">,</span> <span class="number">1_000_000</span><span class="operator">,</span> <span class="variable">APR::Const::POLLIN</span><span class="operator">);</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$rc</span> <span class="operator">==</span> <span class="variable">APR::Const::SUCCESS</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># read the data</span> <span class="operator">}</span> <span class="keyword">else</span> <span class="operator">{</span> <span class="comment"># handle the condition</span> <span class="operator">}</span> </pre> <p> </p> <hr /> <h1><a name="description">Description</a></h1> <p><code>APR::Socket</code> provides the Perl interface to APR sockets.</p> <p> </p> <hr /> <h1><a name="api">API</a></h1> <p><code>APR::Socket</code> provides the following methods:</p> <p> </p> <h2><a name="opt_get"><code>opt_get</code></a></h2> <p>Query socket options for the specified socket</p> <pre> <span class="variable">$val</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_get</span><span class="operator">(</span><span class="variable">$opt</span><span class="operator">);</span> </pre> <dl> <dt><strong><a name="sock" class="item">obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</a></strong> <dd> <p>the socket object to query</p> </dd> </li> <dt><strong><a name="opt" class="item">arg1: <code>$opt</code> ( <code>APR::Const constant|docs::2.0::api::APR::Const/C__socket_</code> )</a></strong> <dd> <p>the socket option we would like to configure. Here are the <a href="../../../docs/2.0/api/APR/Const.html#c__socket_">available socket options</a>.</p> </dd> </li> <dt><strong><a name="val" class="item">ret: <code>$val</code> ( integer )</a></strong> <dd> <p>the currently set value for <a href="../../../docs/2.0/api/APR/Const.html#c__socket_">the socket option</a> you've queried for</p> </dd> </li> <dt><strong><a name="excpt_apr_error_docs_2_0_api_apr_error6" class="item">excpt: <code>APR::Error|docs::2.0::api::APR::Error</code></a></strong> <dt><strong><a name="since_2_0_00260" class="item">since: 2.0.00</a></strong> </dl> <p>Examples can be found in <a href="../../../docs/2.0/api/APR/Const.html#c__socket_">the socket options constants section</a>. For example <a href="../../../docs/2.0/api/APR/Const.html#c_apr__const__so_nonblock_">setting the IO to the blocking mode</a>.</p> <p> </p> <h2><a name="opt_set"><code>opt_set</code></a></h2> <p>Setup socket options for the specified socket</p> <pre> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">$opt</span><span class="operator">,</span> <span class="variable">$val</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> object )</strong> <dd> <p>the socket object to set up.</p> </dd> </li> <dt><strong>arg1: <code>$opt</code> ( <code>APR::Const|docs::2.0::api::APR::Const/C__socket_</code> constant )</strong> <dd> <p>the socket option we would like to configure. Here are the <a href="../../../docs/2.0/api/APR/Const.html#c__socket_">available socket options</a>.</p> </dd> </li> <dt><strong>arg2: <code>$val</code> ( integer )</strong> <dd> <p>value for the option. Refer to the <a href="../../../docs/2.0/api/APR/Const.html#c__socket_">socket options</a> section to learn about the expected values.</p> </dd> </li> <dt><strong><a name="ret_no_return_value17" class="item">ret: no return value</a></strong> <dt><strong><a name="excpt_apr_error_docs_2_0_api_apr_error7" class="item">excpt: <code>APR::Error|docs::2.0::api::APR::Error</code></a></strong> <dt><strong><a name="since_2_0_00261" class="item">since: 2.0.00</a></strong> </dl> <p>Examples can be found in <a href="../../../docs/2.0/api/APR/Const.html#c__socket_">the socket options constants section</a>. For example <a href="../../../docs/2.0/api/APR/Const.html#c_apr__const__so_nonblock_">setting the IO to the blocking mode</a>.</p> <p> </p> <h2><a name="poll"><code>poll</code></a></h2> <p>Poll the socket for events:</p> <pre> <span class="variable">$rc</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">poll</span><span class="operator">(</span><span class="variable">$pool</span><span class="operator">,</span> <span class="variable">$timeout</span><span class="operator">,</span> <span class="variable">$events</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to poll</p> </dd> </li> <dt><strong><a name="pool" class="item">arg1: <code>$pool</code> ( <code>APR::Pool object|docs::2.0::api::APR::Pool</code> )</a></strong> <dd> <p>usually <a href="#pool"><code>$c->pool|docs::2.0::api::Apache2::Connection/C_pool_</code></a>.</p> </dd> </li> <dt><strong><a name="timeout" class="item">arg2: <code>$timeout</code> ( integer )</a></strong> <dd> <p>The amount of time to wait (in milliseconds) for the specified events to occur.</p> </dd> </li> <dt><strong><a name="events" class="item">arg3: <code>$events</code> ( <code>APR::Const :poll constants|docs::2.0::api::APR::Const/C__poll_</code> )</a></strong> <dd> <p>The events for which to wait.</p> </dd> <dd> <p>For example use <code>APR::Const::POLLIN|docs::2.0::api::APR::Const/C_APR__Const__POLLIN_</code> to wait for incoming data to be available, <code>APR::Const::POLLOUT|docs::2.0::api::APR::Const/C_APR__Const__POLLOUT_</code> to wait until it's possible to write data to the socket and <code>APR::Const::POLLPRI|docs::2.0::api::APR::Const/C_APR__Const__POLLPRI_</code> to wait for priority data to become available.</p> </dd> </li> <dt><strong><a name="rc" class="item">ret: <code>$rc</code> ( <code>APR::Const constant|docs::2.0::api::APR::Const</code> )</a></strong> <dd> <p>If <code>APR::Const::SUCCESS</code> 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 <code>APR::Error::strerror|docs::2.0::api::APR::Error/C_strerror_</code>.</p> </dd> </li> <dt><strong><a name="since_2_0_00262" class="item">since: 2.0.00</a></strong> </dl> <p>For example poll a non-blocking socket up to 1 second when reading data from the client:</p> <pre> <span class="keyword">use</span> <span class="variable">APR::Socket</span> <span class="operator">();</span> <span class="keyword">use</span> <span class="variable">APR::Connection</span> <span class="operator">();</span> <span class="keyword">use</span> <span class="variable">APR::Error</span> <span class="operator">();</span> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(SO_NONBLOCK POLLIN SUCCESS TIMEUP)</span><span class="operator">;</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=></span> <span class="number">1</span><span class="operator">);</span> <span class="keyword">my</span> <span class="variable">$rc</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">poll</span><span class="operator">(</span><span class="variable">$c</span><span class="operator">-></span><span class="variable">pool</span><span class="operator">,</span> <span class="number">1_000_000</span><span class="operator">,</span> <span class="variable">APR::Const::POLLIN</span><span class="operator">);</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$rc</span> <span class="operator">==</span> <span class="variable">APR::Const::SUCCESS</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># Data is waiting on the socket to be read.</span> <span class="comment"># $sock->recv(my $buf, BUFF_LEN)</span> <span class="operator">}</span> <span class="keyword">elsif</span> <span class="operator">(</span><span class="variable">$rc</span> <span class="operator">==</span> <span class="variable">APR::Const::TIMEUP</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># One second elapsed and still there is no data waiting to be</span> <span class="comment"># read. for example could try again.</span> <span class="operator">}</span> <span class="keyword">else</span> <span class="operator">{</span> <span class="keyword">die</span> <span class="string">"poll error: "</span> <span class="operator">.</span> <span class="variable">APR::Error::strerror</span><span class="operator">(</span><span class="variable">$rc</span><span class="operator">);</span> <span class="operator">}</span> </pre> <p> </p> <h2><a name="recv"><a href="../../../lib/pods/perlfunc.html#recv"><code>recv</code></a></a></h2> <p>Read incoming data from the socket</p> <pre> <span class="variable">$len</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="variable">$buffer</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::SockAddr object|docs::2.0::api::APR::SockAddr</code> object )</strong> <dd> <p>The socket to read from</p> </dd> </li> <dt><strong><a name="buffer" class="item">arg1: <code>$buffer</code> ( SCALAR )</a></strong> <dd> <p>The buffer to fill. All previous data will be lost.</p> </dd> </li> <dt><strong><a name="wanted" class="item">arg2: <code>$wanted</code> ( int )</a></strong> <dd> <p>How many bytes to attempt to read.</p> </dd> </li> <dt><strong><a name="len" class="item">ret: <code>$len</code> ( number )</a></strong> <dd> <p>How many bytes were actually read.</p> </dd> <dd> <p><code>$buffer</code> gets populated with the string that is read. It will contain an empty string if there was nothing to read.</p> </dd> </li> <dt><strong><a name="excpt_apr_error_docs_2_0_api_apr_error8" class="item">excpt: <code>APR::Error|docs::2.0::api::APR::Error</code></a></strong> <dd> <p>If you get the <code>'(11) Resource temporarily unavailable'</code> error (exception <code>APR::Const::EAGAIN|docs::2.0::api::APR::Const/C_APR__Const__EAGAIN_</code>) (or another equivalent, which might be different on non-POSIX systems), then you didn't ensure that the socket is in <a href="#c_opt_set_">a blocking IO mode</a> before using it. Note that you should use <code>APR::Status::is_EAGAIN|docs::2.0::api::APR::Status/C_is_EAGAIN_</code> to perform this check (since different error codes may be returned for the same event on different OSes). For example if the socket is set to the non-blocking mode and there is no data right away, you may get this exception thrown. So here is how to check for it and retry a few times after short delays:</p> </dd> <dd> <pre> <span class="keyword">use</span> <span class="variable">APR::Status</span> <span class="operator">();</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span><span class="operator">,</span> <span class="number">1</span><span class="operator">);</span> <span class="comment"># ....</span> <span class="keyword">my</span> <span class="variable">$tries</span> <span class="operator">=</span> <span class="number">0</span><span class="operator">;</span> <span class="keyword">my</span> <span class="variable">$buffer</span><span class="operator">;</span> <span class="variable">RETRY</span><span class="operator">:</span> <span class="keyword">my</span> <span class="variable">$rlen</span> <span class="operator">=</span> <span class="keyword">eval</span> <span class="operator">{</span> <span class="variable">$socket</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="variable">$buffer</span><span class="operator">,</span> <span class="variable">SIZE</span><span class="operator">)</span> <span class="operator">};</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$@</span><span class="operator">)</span> <span class="keyword">die</span> <span class="variable">$@</span> <span class="keyword">unless</span> <span class="keyword">ref</span> <span class="variable">$@</span> <span class="operator">&&</span> <span class="variable">APR::Status::is_EAGAIN</span><span class="operator">(</span><span class="variable">$@</span><span class="operator">);</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$tries</span><span class="operator">++</span> <span class="operator"><</span> <span class="number">3</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># sleep 250msec</span> <span class="keyword">select</span> <span class="keyword">undef</span><span class="operator">,</span> <span class="keyword">undef</span><span class="operator">,</span> <span class="keyword">undef</span><span class="operator">,</span> <span class="number">0</span><span class="operator">.</span><span class="number">25</span><span class="operator">;</span> <span class="keyword">goto</span> <span class="variable">RETRY</span><span class="operator">;</span> <span class="operator">}</span> <span class="keyword">else</span> <span class="operator">{</span> <span class="comment"># do something else</span> <span class="operator">}</span> <span class="operator">}</span> <span class="keyword">warn</span> <span class="string">"read </span><span class="variable">$rlen</span><span class="string"> bytes\n"</span> </pre> </dd> <dd> <p>If timeout was set via <code>timeout_set|/C_timeout_set_</code>, you may need to catch the <code>APR::Const::TIMEUP|docs::2.0::api::APR::Const/C_APR__Const__TIMEUP_</code> exception. For example:</p> </dd> <dd> <pre> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(TIMEUP)</span><span class="operator">;</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">timeout_set</span><span class="operator">(</span><span class="number">1_000_000</span><span class="operator">);</span> <span class="comment"># 1 sec</span> <span class="keyword">my</span> <span class="variable">$buffer</span><span class="operator">;</span> <span class="keyword">eval</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="variable">$buffer</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">)</span> <span class="operator">};</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$@</span> <span class="operator">&&</span> <span class="variable">$@</span> <span class="operator">==</span> <span class="variable">APR::Const::TIMEUP</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># timeout, do something, e.g.</span> <span class="operator">}</span> </pre> </dd> <dd> <p>If not handled -- you may get the error <code>'70007: The timeout specified has expired'</code>.</p> </dd> <dd> <p>Another error condition that may occur is the <code>'(104) Connection reset by peer'</code> 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.</p> </dd> <dd> <pre> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(ECONNABORTED)</span><span class="operator">;</span> <span class="keyword">my</span> <span class="variable">$buffer</span><span class="operator">;</span> <span class="keyword">eval</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="variable">$buffer</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">)</span> <span class="operator">};</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$@</span> <span class="operator">==</span> <span class="variable">APR::Const::ECONNABORTED</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># ignore it or deal with it</span> <span class="operator">}</span> </pre> </dd> </li> <dt><strong><a name="since_2_0_00263" class="item">since: 2.0.00</a></strong> </dl> <p>Here is the quick prototype example, which doesn't handle any errors (mod_perl will do that for you):</p> <pre> <span class="keyword">use</span> <span class="variable">APR::Socket</span> <span class="operator">();</span> <span class="comment"># set the socket to the blocking mode if it isn't already</span> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(SO_NONBLOCK)</span><span class="operator">;</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_get</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span><span class="operator">))</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=></span> <span class="number">0</span><span class="operator">);</span> <span class="operator">}</span> <span class="comment"># read from/write to the socket (w/o handling possible failures)</span> <span class="keyword">my</span> <span class="variable">$wanted</span> <span class="operator">=</span> <span class="number">1024</span><span class="operator">;</span> <span class="keyword">while</span> <span class="operator">(</span><span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="keyword">my</span> <span class="variable">$buffer</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">))</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">send</span><span class="operator">(</span><span class="variable">$buffer</span><span class="operator">);</span> <span class="operator">}</span> </pre> <p>If you want to handle errors by yourself, the loop may look like:</p> <pre> <span class="keyword">use</span> <span class="variable">APR::Const</span> <span class="operator">-</span><span class="string">compile</span> <span class="operator">=></span> <span class="string">qw(ECONNABORTED)</span><span class="operator">;</span> <span class="comment"># ...</span> <span class="keyword">while</span> <span class="operator">(</span><span class="number">1</span><span class="operator">)</span> <span class="operator">{</span> <span class="keyword">my</span> <span class="variable">$buf</span><span class="operator">;</span> <span class="keyword">my</span> <span class="variable">$len</span> <span class="operator">=</span> <span class="keyword">eval</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">recv</span><span class="operator">(</span><span class="variable">$buf</span><span class="operator">,</span> <span class="variable">$wanted</span><span class="operator">)</span> <span class="operator">};</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$@</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># handle the error, e.g. to ignore aborted connections but</span> <span class="comment"># rethrow any other errors:</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$@</span> <span class="operator">==</span> <span class="variable">APR::Const::ECONNABORTED</span><span class="operator">)</span> <span class="operator">{</span> <span class="comment"># ignore</span> <span class="keyword">last</span><span class="operator">;</span> <span class="operator">}</span> <span class="keyword">else</span> <span class="operator">{</span> <span class="keyword">die</span> <span class="variable">$@</span><span class="operator">;</span> <span class="comment"># retrow</span> <span class="operator">}</span> <span class="operator">}</span> <span class="keyword">if</span> <span class="operator">(</span><span class="variable">$len</span><span class="operator">)</span> <span class="operator">{</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">send</span><span class="operator">(</span><span class="variable">$buffer</span><span class="operator">);</span> <span class="operator">}</span> <span class="keyword">else</span> <span class="operator">{</span> <span class="keyword">last</span><span class="operator">;</span> <span class="operator">}</span> <span class="operator">}</span> </pre> <p> </p> <h2><a name="send"><a href="../../../lib/pods/perlfunc.html#send"><code>send</code></a></a></h2> <p>Write data to the socket</p> <pre> <span class="variable">$wlen</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">send</span><span class="operator">(</span><span class="variable">$buf</span><span class="operator">,</span> <span class="variable">$opt_len</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to write to</p> </dd> </li> <dt><strong><a name="buf" class="item">arg1: <code>$buf</code> ( scalar )</a></strong> <dd> <p>The data to send</p> </dd> </li> <dt><strong><a name="opt_len" class="item">opt arg2: <code>$opt_len</code> ( int )</a></strong> <dd> <p>There is no need to pass this argument, unless you want to send less data than contained in <code>$buf</code>.</p> </dd> </li> <dt><strong><a name="wlen" class="item">ret: <code>$wlen</code> ( integer )</a></strong> <dd> <p>How many bytes were sent</p> </dd> </li> <dt><strong><a name="since_2_0_00264" class="item">since: 2.0.00</a></strong> </dl> <p>For examples see the <code>recv|/C_recv_</code> item.</p> <p> </p> <h2><a name="timeout_get"><code>timeout_get</code></a></h2> <p>Get socket timeout settings</p> <pre> <span class="variable">$usecs</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">timeout_get</span><span class="operator">();</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to set up.</p> </dd> </li> <dt><strong><a name="usecs" class="item">ret: <code>$usecs</code> ( number)</a></strong> <dd> <p>Currently set timeout in microseconds (and also the blocking IO behavior). See (<code>APR::timeout_set|/C__timeout_set_</code>) for possible values and their meaning.</p> </dd> </li> <dt><strong><a name="excpt_apr_error_docs_2_0_api_apr_error9" class="item">excpt: <code>APR::Error|docs::2.0::api::APR::Error</code></a></strong> <dt><strong><a name="since_2_0_00265" class="item">since: 2.0.00</a></strong> </dl> <p> </p> <h2><a name="timeout_set"><code>timeout_set</code></a></h2> <p>Setup socket timeout.</p> <pre> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">timeout_set</span><span class="operator">(</span><span class="variable">$usecs</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to set up.</p> </dd> </li> <dt><strong>arg1: <code>$usecs</code> ( number )</strong> <dd> <p>Value for the timeout in microseconds and also the blocking IO behavior.</p> </dd> <dd> <p>The possible values are:</p> </dd> <dl> <dt><strong><a name="t_0" class="item">t > 0</a></strong> <dd> <p><a href="../../../lib/pods/perlfunc.html#send"><code>send()|/C__send_</code></a> and <a href="../../../lib/pods/perlfunc.html#recv"><code>recv()|/C__recv_)</code></a> throw (<code>APR::Const::TIMEUP|docs::2.0::api::APR::Const/C__APR__TIMEUP_</code> exception) if specified time elapses with no data sent or received.</p> </dd> <dd> <p>Notice that the positive value is in micro seconds. So if you want to set the timeout for 5 seconds, the value should be: 5_000_000.</p> </dd> <dd> <p>This mode sets the socket into a non-blocking IO mode.</p> </dd> </li> <dt><strong><a name="t_02" class="item">t == 0</a></strong> <dd> <p><a href="../../../lib/pods/perlfunc.html#send"><code>send()|/C__send_</code></a> and <a href="../../../lib/pods/perlfunc.html#recv"><code>recv()|/C__recv_)</code></a> calls never block.</p> </dd> </li> <dt><strong><a name="t_03" class="item">t < 0</a></strong> <dd> <p><a href="../../../lib/pods/perlfunc.html#send"><code>send()|/C__send_</code></a> and <a href="../../../lib/pods/perlfunc.html#recv"><code>recv()|/C__recv_)</code></a> calls block.</p> </dd> <dd> <p>Usually just -1 is used for this case, but any negative value will do.</p> </dd> <dd> <p>This mode sets the socket into a blocking IO mode.</p> </dd> </li> <dt><strong><a name="ret_no_return_value18" class="item">ret: no return value</a></strong> </dl> <dt><strong><a name="excpt_apr_error_docs_2_0_api_apr_error10" class="item">excpt: <code>APR::Error|docs::2.0::api::APR::Error</code></a></strong> <dt><strong><a name="since_2_0_00266" class="item">since: 2.0.00</a></strong> </dl> <p> </p> <hr /> <h1><a name="unsupported_api">Unsupported API</a></h1> <p><code>APR::Socket</code> 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 <a href="../../../maillist/dev.html">the mod_perl development mailing list</a> so we can help each other take the steps necessary to shift the method to an officially supported API.</p> <p> </p> <h2><a name="bind"><a href="../../../lib/pods/perlfunc.html#bind"><code>bind</code></a></a></h2> <p>META: Autogenerated - needs to be reviewed/completed</p> <p>Bind the socket to its associated port</p> <pre> <span class="variable">$ret</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">bind</span><span class="operator">(</span><span class="variable">$sa</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to bind</p> </dd> </li> <dt><strong><a name="sa" class="item">arg1: <code>$sa</code> ( <code>APR::SockAddr object|docs::2.0::api::APR::SockAddr</code> )</a></strong> <dd> <p>The socket address to bind to</p> </dd> </li> <dt><strong><a name="ret" class="item">ret: <code>$ret</code> ( integer )</a></strong> <dt><strong><a name="since_subject_to_change5" class="item">since: subject to change</a></strong> </dl> <p>This may be where we will find out if there is any other process using the selected port.</p> <p> </p> <h2><a name="close"><a href="../../../lib/pods/perlfunc.html#close"><code>close</code></a></a></h2> <p>META: Autogenerated - needs to be reviewed/completed</p> <p>Close a socket.</p> <pre> <span class="variable">$ret</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">close</span><span class="operator">();</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to close</p> </dd> </li> <dt><strong>ret: <code>$ret</code> ( integer )</strong> <dt><strong><a name="since_subject_to_change6" class="item">since: subject to change</a></strong> </dl> <p> </p> <h2><a name="connect"><a href="../../../lib/pods/perlfunc.html#connect"><code>connect</code></a></a></h2> <p>META: Autogenerated - needs to be reviewed/completed</p> <p>Issue a connection request to a socket either on the same machine or a different one.</p> <pre> <span class="variable">$ret</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">connect</span><span class="operator">(</span><span class="variable">$sa</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket we wish to use for our side of the connection</p> </dd> </li> <dt><strong>arg1: <code>$sa</code> ( <code>APR::SockAddr object|docs::2.0::api::APR::SockAdrr</code> )</strong> <dd> <p>The address of the machine we wish to connect to. If NULL, APR assumes that the sockaddr_in in the apr_socket is completely filled out.</p> </dd> </li> <dt><strong>ret: <code>$ret</code> ( integer )</strong> <dt><strong><a name="since_subject_to_change7" class="item">since: subject to change</a></strong> </dl> <p> </p> <h2><a name="listen"><a href="../../../lib/pods/perlfunc.html#listen"><code>listen</code></a></a></h2> <p>META: Autogenerated - needs to be reviewed/completed</p> <p>Listen to a bound socket for connections.</p> <pre> <span class="variable">$ret</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="keyword">listen</span><span class="operator">(</span><span class="variable">$backlog</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to listen on</p> </dd> </li> <dt><strong><a name="backlog" class="item">arg1: <code>$backlog</code> ( integer )</a></strong> <dd> <p>The number of outstanding connections allowed in the sockets listen queue. If this value is less than zero, the listen queue size is set to zero.</p> </dd> </li> <dt><strong>ret: <code>$ret</code> ( integer )</strong> <dt><strong><a name="since_subject_to_change8" class="item">since: subject to change</a></strong> </dl> <p> </p> <h2><a name="recvfrom"><code>recvfrom</code></a></h2> <p>META: Autogenerated - needs to be reviewed/completed</p> <pre> <span class="variable">$ret</span> <span class="operator">=</span> <span class="variable">$from</span><span class="operator">-></span><span class="variable">recvfrom</span><span class="operator">(</span><span class="variable">$sock</span><span class="operator">,</span> <span class="variable">$flags</span><span class="operator">,</span> <span class="variable">$buf</span><span class="operator">,</span> <span class="variable">$len</span><span class="operator">);</span> </pre> <dl> <dt><strong><a name="from" class="item">obj: <code>$from</code> ( <code>APR::SockAddr object|docs::2.0::api::APR::SockAddr</code> )</a></strong> <dd> <p>The apr_sockaddr_t to fill in the recipient info</p> </dd> </li> <dt><strong>arg1: <code>$sock</code> ( <code>APR::SockAddr object|docs::2.0::api::APR::SockAddr</code> )</strong> <dd> <p>The socket to use</p> </dd> </li> <dt><strong><a name="flags" class="item">arg2: <code>$flags</code> ( integer )</a></strong> <dd> <p>The flags to use</p> </dd> </li> <dt><strong>arg3: <code>$buf</code> ( integer )</strong> <dd> <p>The buffer to use</p> </dd> </li> <dt><strong>arg4: <code>$len</code> ( string )</strong> <dd> <p>The length of the available buffer</p> </dd> </li> <dt><strong>ret: <code>$ret</code> ( integer )</strong> <dt><strong><a name="since_subject_to_change9" class="item">since: subject to change</a></strong> </dl> <p> </p> <h2><a name="sendto"><code>sendto</code></a></h2> <p>META: Autogenerated - needs to be reviewed/completed</p> <pre> <span class="variable">$ret</span> <span class="operator">=</span> <span class="variable">$sock</span><span class="operator">-></span><span class="variable">sendto</span><span class="operator">(</span><span class="variable">$where</span><span class="operator">,</span> <span class="variable">$flags</span><span class="operator">,</span> <span class="variable">$buf</span><span class="operator">,</span> <span class="variable">$len</span><span class="operator">);</span> </pre> <dl> <dt><strong>obj: <code>$sock</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</strong> <dd> <p>The socket to send from</p> </dd> </li> <dt><strong><a name="where" class="item">arg1: <code>$where</code> ( <code>APR::Socket object|docs::2.0::api::APR::Socket</code> )</a></strong> <dd> <p>The apr_sockaddr_t describing where to send the data</p> </dd> </li> <dt><strong>arg2: <code>$flags</code> ( integer )</strong> <dd> <p>The flags to use</p> </dd> </li> <dt><strong>arg3: <code>$buf</code> ( scalar )</strong> <dd> <p>The data to send</p> </dd> </li> <dt><strong>arg4: <code>$len</code> ( string )</strong> <dd> <p>The length of the data to send</p> </dd> </li> <dt><strong>ret: <code>$ret</code> ( integer )</strong> <dt><strong><a name="since_subject_to_change10" class="item">since: subject to change</a></strong> </dl> <p> </p> <hr /> <h1><a name="see_also">See Also</a></h1> <p><a href="../../../docs/2.0/index.html">mod_perl 2.0 documentation</a>.</p> <p> </p> <hr /> <h1><a name="copyright">Copyright</a></h1> <p>mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0.</p> <p> </p> <hr /> <h1><a name="authors">Authors</a></h1> <p><a href="../../../about/contributors/people.html">The mod_perl development team and numerous contributors</a>.</p> </body> </html>