PHP Conference Japan 2024

socket_create_listen

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_create_listen在端口上打开套接字以接受连接

描述

socket_create_listen(int $port, int $backlog = SOMAXCONN): Socket|false

socket_create_listen() 创建一个新的 Socket 实例,类型为 AF_INET,在给定端口上的所有本地接口上监听,等待新的连接。

此函数旨在简化创建仅监听以接受新连接的新套接字的任务。

参数

port

要在所有接口上监听的端口。

backlog

backlog 参数定义了挂起连接队列可能增长到的最大长度。可以将 SOMAXCONN 作为 backlog 参数传递,有关更多信息,请参见 socket_listen()

返回值

socket_create_listen() 成功时返回一个新的 Socket 实例,错误时返回 false。可以使用 socket_last_error() 获取错误代码。此代码可以传递给 socket_strerror() 以获取错误的文本说明。

变更日志

版本 描述
8.4.0 的默认值现在是 SOMAXCONN。以前是 128
8.0.0 成功时,此函数现在返回一个 Socket 实例;以前,返回一个 resource

注释

注意:

如果您想创建一个仅在特定接口上监听的套接字,则需要使用 socket_create()socket_bind()socket_listen()

参见

添加注释

用户贡献的注释 3 个注释

jdittmer at ppp0 dot net
20 年前
如果您未指定端口号或为 0,则将选择一个随机的空闲端口。
要在同一台机器上的客户端/服务器之间使用用于 ipc 的端口,您可以使用(减去错误检查)

server.php
<?php
$sock
= socket_create_listen(0);
socket_getsockname($sock, $addr, $port);
print
"服务器正在 $addr:$port 上监听\n";
$fp = fopen($port_file, 'w');
fwrite($fp, $port);
fclose($fp);
while(
$c = socket_accept($sock)) {
/* 执行一些有用的操作 */
socket_getpeername($c, $raddr, $rport);
print
"已收到来自 $raddr:$rport 的连接\n";
}
socket_close($sock);
?>

client.php
<?php
$fp
= fopen($port_file, 'r');
$port = fgets($fp, 1024);
fclose($fp);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, '127.0.0.1', $port);
socket_close($sock);
?>
sysspoof at ng-lab dot org
16 年前
请注意,在 Linux 和 BSD 系统上,端口 1 到 1024 需要 root 权限。因此,建议为您的应用程序选择更高的端口。
basim at baassiri dot com
20 年前
请记住,端口仅在 1 到 65535 之间有效

[编辑注:错别字已更正,感谢 abryant at apple dot com]
To Top