1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/reference/stream/functions/stream-socket-server.xml
2021-12-23 13:02:26 +03:00

232 lines
8.9 KiB
XML
Raw 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>Создаёт интернет-сокет или доменный сокет 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
-->