stream_socket_accept

(PHP 5, PHP 7, PHP 8)

stream_socket_accept接受由 stream_socket_server() 创建的套接字上的连接

描述

stream_socket_accept(resource $socket, ?float $timeout = null, string &$peer_name = null): resource|false

接受先前由 stream_socket_server() 创建的套接字上的连接。

参数

socket

要从中接受连接的服务器套接字。

timeout

覆盖默认的套接字接受超时。时间应以秒为单位。默认情况下,使用 default_socket_timeout

peer_name

如果包含且可从所选传输获得,则将设置为连接的客户端的名称(地址)。

注意:

也可以稍后使用 stream_socket_get_name() 确定。

返回值

返回到已接受的套接字连接的流,或在失败时返回 false

变更日志

版本 描述
8.0.0 timeout 现在可以为空。

注释

警告

此函数不应与 UDP 服务器套接字一起使用。相反,请使用 stream_socket_recvfrom()stream_socket_sendto()

参见

添加注释

用户贡献的注释 5 个注释

mickael dot bailly at free dot fr
18 年前
与函数 socket_accept 相比,此函数多了个“timeout”参数。
要让此函数无限期地等待传入连接,就像 socket_accept 中一样,请将 timeout 设置为 -1。它对 PHP 5.0.4 有效。
Andy at txtNation dot com
12 年前
要检查是否有新的连接正在等待,而不阻塞,或者(当使用非阻塞模式时)不出现通知,可以使用 stream_accept(而不是 socket_select)。

<?php

class GenericClass {

protected
$resSocket=null;

function
acceptConnections() {

# 检查我们是否仍然有资源

if(is_resource($this->resSocket)) {

$arrRead=array($this->resSocket);

$arrWrite=array();

/** @warning 通过引用传递 $arrRead,$arrWrite */
if(stream_select($arrRead,$arrWrite,$arrWrite,0)) {

$resConnection=stream_socket_accept($this->resSocket,0);

# ... 其他操作在这里
}
}
}
}
?>
leleu256NOSPAM at hotmail dot com
19 年前
这段代码可能非常有用...

以下代码适用于“服务器”。它监听消息直到 CTRL-C

<?php
while (true)
{
// 每 5 秒断开连接...
receive_message('127.0.0.1','85',5);
}

function
receive_message($ipServer,$portNumber,$nbSecondsIdle)
{
// 创建套接字...
$socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
if (!
$socket)
{
echo
"$errstr ($errno)<br />\n";
}
else
{
// 当有连接时,我会接收它... 如果我在 $nbSecondsIdle 秒内没有收到消息,以下函数将停止。
while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
$message= fread($conn, 1024);
echo
'我收到了:'.$message;
fputs ($conn, "OK\n");
fclose ($conn);
}
fclose($socket);
}
}
?>

以下代码适用于“客户端”。它发送消息并读取响应...

<?php

send_message
('127.0.0.1','85','要发送的消息...');

function
send_message($ipServer,$portServer,$message)
{
$fp = stream_socket_client("tcp://$ipServer:$portServer", $errno, $errstr);
if (!
$fp)
{
echo
"错误:$errno - $errstr<br />\n";
}
else
{
fwrite($fp,"$message\n");
$response = fread($fp, 4);
if (
$response != "OK\n")
{echo
'命令无法执行...\n原因:'.$response;}
else
{echo
'执行成功...';}
fclose($fp);
}
}
?>
Alex Nordenheim
9 年前
请注意,如果使用 0 作为超时时间,连接将立即超时。
fred dot hakeem dot smith at muslimamerica dot bob dot net
16 年前
敬启者,这可能与您密切相关,stream_set_blocking 对 stream_socket_accept 没有任何影响。
如果您希望它立即返回,无论是否连接,请将超时参数设置为 0。
To Top