-
Notifications
You must be signed in to change notification settings - Fork 105
/
Copy pathstream-socket-server.xml
217 lines (208 loc) · 7.03 KB
/
stream-socket-server.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
<?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
-->