<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.20 $ -->
<refentry xml:id="function.stream-socket-server" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>stream_socket_server</refname>
  <refpurpose>Create an Internet or Unix domain server socket</refpurpose>
 </refnamediv>
 <refsect1>
  <title>Description</title>
  <methodsynopsis>
   <type>resource</type><methodname>stream_socket_server</methodname>
   <methodparam><type>string</type><parameter>local_socket</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter role="reference">errno</parameter></methodparam>
   <methodparam choice="opt"><type>string</type><parameter role="reference">errstr</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>flags</parameter><initializer>STREAM_SERVER_BIND | STREAM_SERVER_LISTEN</initializer></methodparam>
   <methodparam choice="opt"><type>resource</type><parameter>context</parameter></methodparam>
  </methodsynopsis>
  <para>
   Creates a stream or datagram socket on the specified
   <parameter>local_socket</parameter>.  The type of socket created
   is determined by the transport specified using standard URL formatting:
   <literal>transport://target</literal>.  For Internet Domain sockets
   (AF_INET) such as TCP and UDP, the <literal>target</literal> portion
   of the <parameter>remote_socket</parameter> parameter should consist of
   a hostname or IP address followed by a colon and a port number.  For Unix
   domain sockets, the <parameter>target</parameter> portion should point
   to the socket file on the filesystem.

   <parameter>flags</parameter> is a bitmask field which may be set to any
   combination of socket creation flags.  The default value of flags is
   <constant>STREAM_SERVER_BIND</constant> | <constant>STREAM_SERVER_LISTEN</constant>.
  </para>
  <note>
   <para>
    For UDP sockets, you must use <constant>STREAM_SERVER_BIND</constant> as
    the <parameter>flags</parameter> parameter.
   </para>
  </note>
  <para>
   This function only creates a socket, to begin accepting connections
   use <function>stream_socket_accept</function>.
  </para>
  <para>
   If the call fails, it will return &false; and if the optional
   <parameter>errno</parameter> and <parameter>errstr</parameter>
   arguments are present they will be set to indicate the actual
   system level error that occurred in the system-level
   <literal>socket()</literal>, <literal>bind()</literal>, and
   <literal>listen()</literal> calls. If the value returned in
   <parameter>errno</parameter> is <literal>0</literal> and the
   function returned &false;, it is an indication that the error
   occurred before the <literal>bind()</literal> call. This is
   most likely due to a problem initializing the socket. Note that
   the <parameter>errno</parameter> and
   <parameter>errstr</parameter> arguments will always be passed by
   reference.
  </para>
  <para>
   Depending on the environment, Unix domain sockets may not be available.
   A list of available transports can be retrieved using
   <function>stream_get_transports</function>. See
   <xref linkend="transports"/> for a list of bulitin transports.
  </para>
  <para>
   <example>
    <title>Using TCP server sockets</title>
    <programlisting role="php">
<![CDATA[
<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
    fclose($conn);
  }
  fclose($socket);
}
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   The example below shows how to act as a time server which can respond
   to time queries as shown in an example on <function>stream_socket_client</function>.
   <note>
    <simpara>
     Most systems require root access to create a server socket on a port
     below 1024.
    </simpara>
   </note>
   <example>
    <title>Using UDP server sockets</title>
    <programlisting role="php">
<![CDATA[
<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}

do {
    $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\n";
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);

?>

]]>
    </programlisting>
   </example>
  </para>
  &ipv6.brackets;
  <para>
   See also <function>stream_socket_client</function>,
   <function>stream_set_blocking</function>,
   <function>stream_set_timeout</function>,
   <function>fgets</function>,
   <function>fgetss</function>, <function>fwrite</function>,
   <function>fclose</function>, <function>feof</function>, and
   the <link linkend="ref.curl">Curl extension</link>.
  </para>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->