stream_socket_server
(PHP 5, PHP 7, PHP 8)
stream_socket_server — 创建 Internet 或 Unix 域服务器套接字
说明
string
$address,int
&$error_code = null,string
&$error_message = null,int
$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,?resource
$context = null): resource|false
在指定 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。
参见
- stream_socket_client() - Open Internet or Unix domain socket connection
- stream_set_blocking() - 为资源流设置阻塞或者阻塞模式
- stream_set_timeout() - Set timeout period on a stream
- fgets() - 从文件指针中读取一行
- fgetss() - 从文件指针中读取一行并过滤掉 HTML 标记
- fwrite() - 写入文件(可安全用于二进制文件)
- fclose() - 关闭一个已打开的文件指针
- feof() - 测试文件指针是否到了文件结束的位置
- Curl 扩展