PHP Conference Japan 2024

socket_recvfrom

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

socket_recvfrom接收来自套接字的数据,无论套接字是否面向连接

描述

socket_recvfrom(
    Socket $socket,
    字符串 &$data,
    整数 $length,
    整数 $flags,
    字符串 &$address,
    整数 &$port = null
): 整数|false

函数 socket_recvfrom() 使用 socket 从端口 port 上的 address 接收 data 中的 length 字节数据(如果套接字类型不是 AF_UNIX)。socket_recvfrom() 可用于从已连接和未连接的套接字收集数据。此外,可以指定一个或多个标志来修改函数的行为。

必须通过引用传递 addressport。如果套接字不是面向连接的,则 address 将设置为远程主机的互联网协议地址或 UNIX 套接字的路径。如果套接字是面向连接的,则 addressnull。此外,对于未连接的 AF_INETAF_INET6 套接字,port 将包含远程主机的端口。

注意: 此函数是二进制安全的。

参数

socket

socket 必须是 Socket 实例,该实例之前由 socket_create() 创建。

data

接收到的数据将被提取到 data 指定的变量中。

length

最多将从远程主机获取 length 字节数据。

flags

flags 的值可以是以下标志的任意组合,并使用二进制或 (|) 运算符连接。

flags 的可能值
标志 描述
MSG_OOB 处理带外数据。
MSG_PEEK 从接收队列的开头接收数据,但不将其从队列中删除。
MSG_WAITALL 阻塞,直到至少接收到 length 个字节。但是,如果捕获到信号或远程主机断开连接,则该函数可能会返回较少的数据。
MSG_DONTWAIT 设置此标志后,即使函数通常会阻塞,它也会返回。
address

如果套接字的类型为 AF_UNIX 类型,则 address 是文件的路径。否则,对于未连接的套接字,address 是远程主机的 IP 地址,或者如果套接字是面向连接的,则为 null

port

此参数仅适用于 AF_INETAF_INET6 套接字,并指定接收数据所在的远程端口。如果套接字是面向连接的,则 port 将为 null

返回值

socket_recvfrom() 返回接收到的字节数,如果发生错误则返回 false。可以通过调用 socket_last_error() 获取实际的错误代码。此错误代码可以传递给 socket_strerror() 以获取错误的文本说明。

变更日志

版本 描述
8.0.0 socket 现在是 Socket 实例;之前,它是一个 资源

范例

示例 #1 socket_recvfrom() 示例

<?php

$socket
= socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 1223);

$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 12, 0, $from, $port);

echo
"接收来自远程地址 $from 和远程端口 $port$buf" . PHP_EOL;
?>

此示例将在 127.0.0.1 的端口 1223 上启动一个 UDP 套接字,并打印从远程主机接收到的最多 12 个字符。

参见

添加注释

用户贡献的注释 4 条注释

3
lorin dot weilenmann at gmail dot com
9 年前
如果您在 UDP 套接字上使用 socket_recvfrom 并将其与 MSG_DONTWAIT 标志结合使用,如果没有任何内容可读,它将引发 PHP 警告。据我所知,除了使用 @ 抑制警告之外,没有其他方法可以避免该警告(即,您无法在调用 socket_recvfrom 之前检查是否有数据)。
2
ply2attoetensen-project.com
7 年前
MSG_DONTWAIT 似乎不存在于 Windows 套接字中。但是 socket_set_nonblock() 似乎可以解决问题。
1
davide dot renzi at gmail dot com
12 年前
请注意!在某些 PHP 版本中,未定义 MSG_DONTWAIT 标志(请参阅 https://bugs.php.net/bug.php?id=48326
-3
jaggerwang at gmail dot com
17 年前
我对 socket_recvfrom() 的返回值感到困惑,它在失败时显示 -1,但当我这样调用时

if (($len = @socket_recvfrom($sock, $result, 32, 0, $ip, $port)) == -1) {
if ($this->_debug) {
echo "socket_read() failed: " . socket_strerror(socket_last_error()) . "\n";
}
return false;
}

变量 $len 为 false,当我将缓冲区长度从 32 更改为 4096 时,它就变为正确。
To Top