请注意,stream_socket_recvfrom() 会绕过流包装器,包括 TLS/SSL。使用 fread() 从加密流读取时将返回解密的数据,而使用 stream_socket_recvfrom() 将为您提供原始的加密字节。
(PHP 5, PHP 7, PHP 8)
stream_socket_recvfrom — 接收来自已连接或未连接套接字的数据
stream_socket_recvfrom() 从远程套接字接收最多 length
字节的数据。
socket
远程套接字。
length
要从 socket
接收的字节数。
flags
flags
的值可以是以下值的任意组合
STREAM_OOB |
处理 OOB(out-of-band )数据。 |
STREAM_PEEK |
从套接字检索数据,但不使用缓冲区。随后对 fread() 或 stream_socket_recvfrom() 的调用将看到相同的数据。 |
address
如果提供了 address
,它将填充远程套接字的地址。
返回读取的数据(作为字符串),如果失败则返回 false
。
示例 #1 stream_socket_recvfrom() 示例
<?php
/* 打开一个到本地主机 1234 端口的服务器套接字 */
$server = stream_socket_server('tcp://127.0.0.1:1234');
/* 接受连接 */
$socket = stream_socket_accept($server);
/* 获取 OOB 数据包(1500 是典型的 MTU 大小)*/
echo "Received Out-Of-Band: '" . stream_socket_recvfrom($socket, 1500, STREAM_OOB) . "'\n";
/* 预览正常的带内数据,但不使用它。 */
echo "Data: '" . stream_socket_recvfrom($socket, 1500, STREAM_PEEK) . "'\n";
/* 再次获取完全相同的数据包,但这次将其从缓冲区中删除。 */
echo "Data: '" . stream_socket_recvfrom($socket, 1500) . "'\n";
/* 关闭 */
fclose($socket);
fclose($server);
?>
注意:
如果接收到的消息长于
length
参数,则可能会根据接收消息的套接字类型(例如 UDP)丢弃多余的字节。
注意:
在基于套接字的流上调用 stream_socket_recvfrom(),在调用基于缓冲区的流函数(如 fread() 或 stream_get_line())之后,会直接从套接字读取数据并绕过流缓冲区。
请注意,stream_socket_recvfrom() 会绕过流包装器,包括 TLS/SSL。使用 fread() 从加密流读取时将返回解密的数据,而使用 stream_socket_recvfrom() 将为您提供原始的加密字节。
如果使用 ipv6,此方法可能返回与 stream_socket_sendto() 不兼容的对等地址。
recvfrom 返回的 IP 地址没有括号 ([]),并且附加了端口,看起来像 ::1:1234。要正确地截取它,请使用 strrpos()