PHP Streams函数

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可选。 指定一个位掩码字段,该字段可以设置为套接字创建标志的任意组合。
  • 对于 UDP 套接字,必须使用 STREAM_SERVER_BIND 作为 flags 参数。
默认为 STREAM_SERVER_BIND | STREAM_SERVER_LISTEN。
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。