-
Notifications
You must be signed in to change notification settings - Fork 109
Expand file tree
/
Copy pathsocket-recv.xml
More file actions
251 lines (229 loc) · 7.59 KB
/
socket-recv.xml
File metadata and controls
251 lines (229 loc) · 7.59 KB
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 765056369ba5cfb582b2edfd9d83831b70690feb Maintainer: daijie Status: ready -->
<!-- CREDITS: her-cat, Luffy, mowangjuanzi -->
<refentry xml:id="function.socket-recv" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>socket_recv</refname>
<refpurpose>从已连接的 socket 接收数据</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>int</type><type>false</type></type><methodname>socket_recv</methodname>
<methodparam><type>Socket</type><parameter>socket</parameter></methodparam>
<methodparam><type class="union"><type>string</type><type>null</type></type><parameter role="reference">data</parameter></methodparam>
<methodparam><type>int</type><parameter>length</parameter></methodparam>
<methodparam><type>int</type><parameter>flags</parameter></methodparam>
</methodsynopsis>
<para>
函数 <function>socket_recv</function> 从 <parameter>socket</parameter> 中接收长度为
<parameter>length</parameter> 字节的数据,并保存在 <parameter>data</parameter> 中。
<function>socket_recv</function> 用于从已连接的 socket 中接收数据。除此之外,可以设定一个或多个 flags
来控制函数的具体行为。
</para>
<para>
<parameter>data</parameter> 是传引用的,因此必须以变量的形式,指定到参数列表。从
<parameter>socket</parameter> 中接收到的数据将会保存在 <parameter>data</parameter> 中。
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>socket</parameter></term>
<listitem>
<para>
参数 <parameter>socket</parameter> 必须是一个由 <function>socket_create</function>
创建的 <classname>Socket</classname> 实例。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>data</parameter></term>
<listitem>
<para>
从 socket 中获取的数据将被保存在由 <parameter>data</parameter> 指定的变量中。
如果有错误发生,如链接被重置,数据不可用等等,<parameter>data</parameter> 将被设为 &null;。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>length</parameter></term>
<listitem>
<para>
从远程主机接收长度最多为 <parameter>length</parameter> 字节的数据。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>flags</parameter></term>
<listitem>
<para>
<parameter>flags</parameter> 的值可以为下列任意 flag 的组合。使用按位或运算符(<literal>|</literal>)来
组合不同的 flag。
</para>
<table>
<title>可用的 <parameter>flags</parameter> 值</title>
<tgroup cols="2">
<thead>
<row>
<entry>Flag</entry>
<entry>描述</entry>
</row>
</thead>
<tbody>
<row>
<entry><constant>MSG_OOB</constant></entry>
<entry>
处理超出边界的数据
</entry>
</row>
<row>
<entry><constant>MSG_PEEK</constant></entry>
<entry>
从接收队列的起始位置接收数据,但不将他们从接收队列中移除。
</entry>
</row>
<row>
<entry><constant>MSG_WAITALL</constant></entry>
<entry>
在接收到至少 <parameter>length</parameter> 字节的数据之前,造成一个阻塞,并暂停脚本运行(block)。但是,
如果接收到中断信号,或远程服务器断开连接,该函数将返回少于 <parameter>length</parameter> 字节的数据。
</entry>
</row>
<row>
<entry><constant>MSG_DONTWAIT</constant></entry>
<entry>
如果指定了该 flag,函数将不会造成阻塞,即使在全局设置中指定了阻塞设置。
</entry>
</row>
</tbody>
</tgroup>
</table>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<function>socket_recv</function> 返回一个数字,表示接收到的字节数。如果发生了错误,则返回 &false;
错误码可使用 <function>socket_last_error</function> 接收。也可使用函数 <function>socket_strerror</function>
来取得关于错误的文字描述。
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
&sockets.changelog.socket-param;
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>socket_recv</function> 示例</title>
<para>
该示例简单地使用 <function>socket_recv</function> 重写了 <xref linkend="sockets.examples"/> 中的
第一个示例。
</para>
<programlisting role="php">
<![CDATA[
<?php
error_reporting(E_ALL);
echo "<h2>TCP/IP Connection</h2>\n";
/* 获取 WWW 服务的端口。 */
$service_port = getservbyname('www', 'tcp');
/* 获取目标主机的 IP 地址。 */
$address = gethostbyname('www.example.com');
/* 创建 TCP/IP 套接字。 */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "OK.\n";
}
echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}
$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';
echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
echo "Reading response:\n\n";
$buf = 'This is my buffer.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo "Read $bytes bytes from socket_recv(). Closing socket...";
} else {
echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);
echo $buf . "\n";
echo "OK.\n\n";
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
<h2>TCP/IP Connection</h2>
OK.
Attempting to connect to '208.77.188.166' on port '80'...OK.
Sending HTTP HEAD request...OK.
Reading response:
Read 123 bytes from socket_recv(). Closing socket...HTTP/1.1 200 OK
Date: Mon, 14 Sep 2009 08:56:36 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
ETag: "b80f4-1b6-80bfd280"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8
OK.
]]>
</screen>
</example>
</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:"~/.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
-->