PHP Conference Japan 2024

stream_socket_recvfrom

(PHP 5, PHP 7, PHP 8)

stream_socket_recvfrom接收来自已连接或未连接套接字的数据

描述

stream_socket_recvfrom(
    资源 $socket,
    整数 $length,
    整数 $flags = 0,
    ?字符串 &$address = null
): 字符串|false

stream_socket_recvfrom() 从远程套接字接收最多 length 字节的数据。

参数

socket

远程套接字。

length

要从 socket 接收的字节数。

flags

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())之后,会直接从套接字读取数据并绕过流缓冲区。

参见

添加注释

用户贡献的注释 2 个注释

cweiske at php dot net
14 年前
请注意,stream_socket_recvfrom() 会绕过流包装器,包括 TLS/SSL。使用 fread() 从加密流读取时将返回解密的数据,而使用 stream_socket_recvfrom() 将为您提供原始的加密字节。
MagicalTux at php dot net
13 年前
如果使用 ipv6,此方法可能返回与 stream_socket_sendto() 不兼容的对等地址。

recvfrom 返回的 IP 地址没有括号 ([]),并且附加了端口,看起来像 ::1:1234。要正确地截取它,请使用 strrpos()
To Top