stream_socket_server
stream_socket_server
(PHP 5, PHP 7)
stream_socket_server - 创建一个Internet或Unix域服务器套接字
描述
resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )
在指定的位置创建一个流或数据报套接字local_socket
。
这个函数只创建一个套接字,开始接受使用stream_socket_accept()的连接。
参数
local_socket
创建的套接字类型由使用标准URL格式指定的传输确定:transport://target
。
对于AF_INET
诸如TCP和UDP的Internet域套接字(),参数的目标
部分remote_socket
应由主机名或IP地址,后跟冒号和端口号组成。对于Unix域套接字,目标
部分应指向文件系统上的套接字文件。
根据环境的不同,Unix域套接字可能不可用。可以使用stream_get_transports()检索可用传输列表。有关bulitin传输列表,请参阅支持的套接字传输列表。
errno
如果可选errno
和errstr
参数时,它们将被设置为表明发生在系统级的实际系统级错误socket()
,bind()的
,和listen()
调用。如果返回的errno
值为0
并且函数返回FALSE
,则表明错误发生在bind()
调用之前。这很可能是由于初始化套接字时出现问题。需要注意的是,errno
和errstr
参数将始终通过引用传递。
errstr
请参阅errno
说明。
flags
位掩码字段可以设置为套接字创建标志的任意组合。
注意
:对于UDP套接字,您必须将其STREAM_SERVER_BIND
用作flags
参数。
context
返回值
返回创建的流,或者出错返回FALSE
。
示例
示例#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()中的示例所示。
注意
:大多数系统需要root访问才能在1024以下的端口上创建服务器套接字。
示例#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() - 打开Internet或Unix域套接字连接
- stream_set_blocking() - 在流上设置阻塞/非阻塞模式
- stream_set_timeout() - 设置流上的超时时间
- fgets() - 从文件指针获取行
- fgetss() - 从文件指针获取行并去除HTML标签
- fwrite() - 二进制安全文件写入
- fclose() - 关闭打开的文件指针
- feof() - 测试文件结尾的文件指针
← stream_socket_sendto
stream_socket_shutdown →