1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/reference/stream/functions/stream-socket-server.xml

238 lines
9.0 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: a1702b5d45ad950c5f7a077878378a37851a2df6 Maintainer: mch Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.stream-socket-server" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>stream_socket_server</refname>
<refpurpose>Создаёт серверный сокет Internet- или Unix-домена</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>resource</type><type>false</type></type><methodname>stream_socket_server</methodname>
<methodparam><type>string</type><parameter>address</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter role="reference">error_code</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter role="reference">error_message</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>flags</parameter><initializer>STREAM_SERVER_BIND | STREAM_SERVER_LISTEN</initializer></methodparam>
<methodparam choice="opt"><type class="union"><type>resource</type><type>null</type></type><parameter>context</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
Функция создаёт сокет потока или датаграммы на адресе,
который установили в параметре <parameter>address</parameter>.
</para>
<para>
Функция только создаёт сокет, а начать приём соединений помогает
функция <function>stream_socket_accept</function>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>address</parameter></term>
<listitem>
<para>
Тип сокета, который создаёт функция, определяет транспорт, который указывается
стандартным форматированием URL-адресов: <literal>transport://target</literal>.
</para>
<para>
Для <constant>AF_INET</constant>-сокетов интернет-домена наподобие TCP и UDP
часть <literal>target</literal> параметра
<parameter>remote_socket</parameter> требуется указать в виде имени хоста
или IP-адреса, за которыми идёт двоеточие и номер порта. Для сокетов
Unix-домена часть <literal>target</literal> должна указывать
на файл сокета в файловой системе.
</para>
<para>
Сокеты Unix-домена доступны не в каждом окружении.
Список доступных транспортов возвращает функция
<function>stream_get_transports</function>. Список встроенных транспортов
приводит раздел «<xref linkend="transports"/>».
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_code</parameter></term>
<listitem>
<para>
Функция заполнит параметры <parameter>error_code</parameter>
и <parameter>error_message</parameter> значениями, которые укажут действительный уровень
ошибки системного уровня, которая возникла при вызовах системного уровня
<literal>socket()</literal>, <literal>bind()</literal> и <literal>listen()</literal>,
если при вызове функции передали аргументы для этих параметров.
Если в параметр <parameter>error_code</parameter> вернулось значение
<literal>0</literal>, а функция вернула &false;, значит,
ошибка возникла до системного вызова <literal>bind()</literal>.
Самая частая причина — проблема инициализации сокета.
Обратите внимание, что аргументы <parameter>error_code</parameter>
и <parameter>error_message</parameter> передаются по ссылке.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_message</parameter></term>
<listitem>
<para>
Смотрите описание параметра <parameter>error_code</parameter>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>flags</parameter></term>
<listitem>
<para>
Поле битовой маски, в которой разрешается устанавливать произвольную комбинацию
флагов создаваемого сокета.
</para>
<note>
<para>
Для UDP-сокетов требуется указывать константу <constant>STREAM_SERVER_BIND</constant>
как флаг параметра <parameter>flags</parameter>.
</para>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>context</parameter></term>
<listitem>
<para>
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция возвращает новый поток или &false;, если возникла ошибка.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
Параметр <parameter>context</parameter> теперь принимает значение null.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования серверных TCP-сокетов</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, 'Локальное время ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
?>
]]>
</programlisting>
</example>
</para>
<para>
Следующий пример показывает, как действовать как сервер времени, который умеет отвечать
на запросы времени, как показывает пример с функцией <function>stream_socket_client</function>.
<note>
<simpara>
На большей части систем требуется доступ с правами пользователя root,
чтобы создать серверный сокет на порту ниже 1024-го.
</simpara>
</note>
<example>
<title>Пример использования серверных сокетов UDP</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>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
&ipv6.brackets;
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><function>stream_socket_client</function></member>
<member><function>stream_set_blocking</function></member>
<member><function>stream_set_timeout</function></member>
<member><function>fgets</function></member>
<member><function>fgetss</function></member>
<member><function>fwrite</function></member>
<member><function>fclose</function></member>
<member><function>feof</function></member>
<member><link linkend="ref.curl">Модуль curl</link></member>
</simplelist>
</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:"~/.phpdoc/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
-->