socket_recv

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_recv從已連接的 socket 接收數(shù)據(jù)

說(shuō)明

socket_recv(
    Socket $socket,
    ?string &$data,
    int $length,
    int $flags
): int|false

函數(shù) socket_recv()socket 中接受長(zhǎng)度為 length 字節(jié)的數(shù)據(jù),并保存在 data 中。 socket_recv() 用于從已連接的 socket 中接收數(shù)據(jù)。除此之外,可以設(shè)定一個(gè)或多個(gè) flags 來(lái)控制函數(shù)的具體行為。

data 是傳引用的,因此必須以變量的形式,指定到參數(shù)列表。從 socket 中接收到的數(shù)據(jù)將會(huì)保存在 data 中。

參數(shù)

socket

參數(shù) socket 必須是一個(gè)由 socket_create() 創(chuàng)建的 Socket 實(shí)例。

data

從 socket 中獲取的數(shù)據(jù)將被保存在由 data 指定的變量中。 如果有錯(cuò)誤發(fā)生,如鏈接被重置,數(shù)據(jù)不可用等等, data 將被設(shè)為 null。

length

長(zhǎng)度最多為 length 字節(jié)的數(shù)據(jù)將被接收。

flags

flags 的值可以為下列任意 flag 的組合。使用按位或運(yùn)算符(|)來(lái) 組合不同的 flag。

可用的 flags
Flag 描述
MSG_OOB 處理超出邊界的數(shù)據(jù)
MSG_PEEK 從接受隊(duì)列的起始位置接收數(shù)據(jù),但不將他們從接受隊(duì)列中移除。
MSG_WAITALL 在接收到至少 length 字節(jié)的數(shù)據(jù)之前,造成一個(gè)阻塞,并暫停腳本運(yùn)行(block)。但是, 如果接收到中斷信號(hào),或遠(yuǎn)程服務(wù)器斷開連接,該函數(shù)將返回少于 length 字節(jié)的數(shù)據(jù)。
MSG_DONTWAIT 如果指定了該 flag,函數(shù)將不會(huì)造成阻塞,即使在全局設(shè)置中指定了阻塞設(shè)置。

返回值

socket_recv() 返回一個(gè)數(shù)字,表示接收到的字節(jié)數(shù)。如果發(fā)生了錯(cuò)誤,則返回 false 錯(cuò)誤碼可使用 socket_last_error() 接收。也可使用函數(shù) socket_strerror() 來(lái)取得關(guān)于錯(cuò)誤的文字描述。

更新日志

版本 說(shuō)明
8.0.0 現(xiàn)在 socketSocket 實(shí)例, 之前是 resource

范例

示例 #1 socket_recv() 范例

該范例簡(jiǎn)單地使用 socket_recv() 重寫了 范例 中的 第一個(gè)例子。

<?php
error_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_INETSOCK_STREAMSOL_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$instrlen($in));
echo 
"OK.\n";

echo 
"Reading response:\n\n";
$buf 'This is my buffer.';
if (
false !== ($bytes socket_recv($socket$buf2048MSG_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.