(PHP 5, PHP 7, PHP 8)
stream_socket_server — 创建 Internet 或 Unix 域服务器套接字
$address
,&$error_code
= null
,&$error_message
= null
,$flags
= STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,$context
= null
在指定 address
上创建 stream 或者数据包套接字(datagram socket)。
此函数仅创建套接字,并使用 stream_socket_accept() 开始接受连接。
address
传输器决定创建的套接字类型,其传输器由标准 URL 格式(transport://target
)指定。
对于 Internet 域套接字(AF_INET
),比如 TCP 和 UDP,
remote_socket
参数的 target
部分应由主机名或者 IP 地址,随后跟着冒号和端口号组成。
对于 Unix 域套接字, target
部分指向文件系统中的套接字文件。
环境的不同,可能会导致 Unix 域套接字无法使用。可以使用 stream_get_transports() 检索可以使用的传输器列表。查看所支持的套接字传输器列表获取内置传输器列表。
error_code
如果指定了可选的 error_code
和 error_message
参数,它们将被设置为指出在系统级别进行 socket()
、bind()
、
listen()
调用时发生的真实系统级别错误。如果 error_code
返回的值为 0
且函数返回 false
,则表明错误发生在 bind()
调用之前。请注意 error_code
和 error_message
始终通过引用传递。
error_message
参阅 error_code
描述。
flags
位掩码字段,可以设置为套接字创建 flag 的任意组合。
注意:
对于 UDP 套接字,你必须使用
STREAM_SERVER_BIND
作为flags
参数。
context
返回已创建的 stream,错误时返回 false
。
版本 | 说明 |
---|---|
8.0.0 |
context 现在可为 null。
|
示例 #1 使用 TCP 服务器套接字
<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
?>
下面的示例展示了如何充当时间服务器,可以响应时间查询,正如 stream_socket_client() 上的示例。
注意: 大多数系统在低于 1024 的端口号上创建服务器套接字时需要 root 访问权限。
示例 #2 使用 UDP 服务器套接字
<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("$errstr ($errno)");
}
do {
$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
echo "$peer\n";
stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);
?>
注意: 当指定数值型的 IPv6 地址(例如
fe80::1
)时必须用方括号将 IP 围起来——例如,tcp://[fe80::1]:80
。