PHP Conference Japan 2024

stream_socket_accept

(PHP 5, PHP 7, PHP 8)

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

描述

stream_socket_accept(资源 $socket, ?浮点数 $timeout = null, 字符串 &$peer_name = null): 资源|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()

参见

添加注释

用户贡献的注释 2 条注释

leleu256NOSPAM at hotmail dot com
20 年前
这段代码可能非常有用...

以下代码用于“服务器”。它监听消息,直到按下 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);
}
}
?>
Andy at txtNation dot com
13年前
要检查是否有新的连接等待,而不阻塞,或者(在使用非阻塞模式时)不发出通知,可以使用 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);

# ...此处其他内容
}
}
}
}
?>
To Top