PHP stream_socket_server() 函数在指定的 local_socket 上创建 Internet 或 Unix 域服务器套接字。此函数仅创建一个套接字,要开始接受连接,请使用 stream_socket_accept()。
类型创建的套接字由使用标准 URL 格式指定的传输确定:transport://target。
对于 Internet 域套接字 (AF_INET)(例如 TCP 和 UDP),remote_socket 参数的目标部分应包含主机名或 IP 地址,后跟冒号和端口号。
对于 Unix 域套接字,目标部分应指向文件系统上的套接字文件。
语法
stream_socket_server(local_socket, $errno,
errstr, flags, context)
参数
local_socket | 必需。 指定要创建的套接字的地址。 |
errno | 可选。 将被设置为系统级socket()、bind()和listen()中发生的系统级错误i> 调用。 |
errstr | 可选。 将被设置为系统级socket()、bind()和listen()<中发生的系统级错误消息/i> 调用。 |
flags | 可选。 指定一个位掩码字段,该字段可以设置为套接字创建标志的任意组合。
|
context | 可选。 指定使用 stream_context_create() 函数创建的上下文资源。 |
返回值
返回创建的流,错误时返回 false。
异常
失败时返回errno 和 errstr 参数将被设置来指示系统级 socket()、bind() 和 listen() 调用。如果errno中返回的值为0并且函数返回false,则表明错误发生在bind()调用之前。这很可能是由于初始化套接字时出现问题造成的。请注意,errno 和 errstr 参数始终通过引用传递。
示例:stream_socket_server() 示例
下面的示例显示了如何充当可以响应时间查询的时间服务器。
<?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);
}
?>
示例:使用 UDP 服务器套接字
在下面的示例中,stream_socket_server() 函数与 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。