1
0
mirror of https://github.com/php/doc-zh.git synced 2026-03-25 15:42:15 +01:00
Files
archived-doc-zh/reference/stream/functions/stream-socket-server.xml
魔王卷子 cd46c66dd3 create stream-socket-server.xml (#302)
* create stream-socket-server.xml

* update
2022-09-02 07:26:09 +08:00

218 lines
7.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"?>
<!-- $Revision$ -->
<!-- EN-Revision: a1702b5d45ad950c5f7a077878378a37851a2df6 Maintainer: mowangjuanzi Status: ready -->
<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> 上创建 stream 或者数据包套接字datagram socket
</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>
对于 Internet 域套接字(<constant>AF_INET</constant>),比如 TCP 和 UDP
<parameter>remote_socket</parameter> 参数的 <literal>target</literal>
部分应由主机名或者 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>
位掩码字段,可以设置为套接字创建 flag 的任意组合。
</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>
返回已创建的 stream错误时返回 &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, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
?>
]]>
</programlisting>
</example>
</para>
<para>
下面的示例展示了如何充当时间服务器,可以响应时间查询,正如 <function>stream_socket_client</function> 上的示例。
<note>
<simpara>
大多数系统在低于 1024 的端口号上创建服务器套接字时需要 root 访问权限。
</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
-->