(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_recv — 從已連接的 socket 接收數據
函數 socket_recv() 從 socket
中接受長(cháng)度為
length
字節的數據,并保存在 data
中。
socket_recv() 用于從已連接的 socket 中接收數據。除此之外,可以設定一個(gè)或多個(gè) flags
來(lái)控制函數的具體行為。
data
是傳引用的,因此必須以變量的形式,指定到參數列表。從
socket
中接收到的數據將會(huì )保存在 data
中。
socket
參數 socket
必須是一個(gè)由 socket_create()
創(chuàng )建的 Socket 實(shí)例。
data
從 socket 中獲取的數據將被保存在由 data
指定的變量中。
如果有錯誤發(fā)生,如鏈接被重置,數據不可用等等, data
將被設為 null
。
length
長(cháng)度最多為 length
字節的數據將被接收。
flags
flags
的值可以為下列任意 flag 的組合。使用按位或運算符(|
)來(lái)
組合不同的 flag。
Flag | 描述 |
---|---|
MSG_OOB |
處理超出邊界的數據 |
MSG_PEEK |
從接受隊列的起始位置接收數據,但不將他們從接受隊列中移除。 |
MSG_WAITALL |
在接收到至少 length 字節的數據之前,造成一個(gè)阻塞,并暫停腳本運行(block)。但是,
如果接收到中斷信號,或遠程服務(wù)器斷開(kāi)連接,該函數將返回少于 length 字節的數據。
|
MSG_DONTWAIT |
如果指定了該 flag,函數將不會(huì )造成阻塞,即使在全局設置中指定了阻塞設置。 |
socket_recv() 返回一個(gè)數字,表示接收到的字節數。如果發(fā)生了錯誤,則返回 false
錯誤碼可使用 socket_last_error() 接收。也可使用函數 socket_strerror()
來(lái)取得關(guān)于錯誤的文字描述。
版本 | 說(shuō)明 |
---|---|
8.0.0 |
現在 socket 是 Socket 實(shí)例,
之前是 resource。
|
示例 #1 socket_recv() 范例
該范例簡(jiǎn)單地使用 socket_recv() 重寫(xiě)了 范例 中的 第一個(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_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.