Php/docs/function.socket-recv
socket_recv
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_recv — 从已连接的socket接收数据
说明
socket_recv
( resource $socket
, string &$buf
, int $len
, int $flags
) : int
函数 socket_recv() 从 socket
中接受长度为
len
字节的数据,并保存在 buf
中。
socket_recv() 用于从已连接的socket中接收数据。除此之外,可以设定一个或多个 flags
来控制函数的具体行为。
buf
以引用形式传递,因此必须是一个以声明的有效的变量。从
socket
中接收到的数据将会保存在 buf
中。
参数
socket
参数
socket
必须是一个由 socket_create() 创建的socket资源。buf
从socket中获取的数据将被保存在由
buf
制定的变量中。 如果有错误发生,如链接被重置,数据不可用等等,buf
将被设为null
。len
长度最多为
len
字节的数据将被接收。flags
flags
的值可以为下列任意flag的组合。使用按位或运算符(|
)来 组合不同的flag。可用的 flags
值Flag 描述 MSG_OOB
处理超出边界的数据 MSG_PEEK
从接受队列的起始位置接收数据,但不将他们从接受队列中移除。 MSG_WAITALL
在接收到至少 len
字节的数据之前,造成一个阻塞,并暂停脚本运行(block)。但是,如果接收到中断信号,或远程服务器断开连接,该函数将返回少于
len
字节的数据。MSG_DONTWAIT
如果制定了该flag,函数将不会造成阻塞,即使在全局设置中指定了阻塞设置。
返回值
socket_recv() 返回一个数字,表示接收到的字节数。如果发生了错误,则返回 false
错误码可使用 socket_last_error() 接收。也可使用函数 socket_strerror()
来取得关于错误的文字描述。
范例
Example #1 socket_recv() 范例
该范例简单地使用 socket_recv() 重写了 范例 中的 第一个例子。
<?phperror_reporting(E_ALL);echo "<h2>TCP/IP Connection</h2>\n";/* Get the port for the WWW service. */$service_port = getservbyname('www', 'tcp');/* Get the IP address for the target host. */$address = gethostbyname('www.example.com');/* Create a TCP/IP socket. */$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";?>
The above example will produce something like:
<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.