socket_create_listen()
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
在一个端口上打开 socket 监听
说明
socket_create_listen(int $port[,int $backlog= 128]):Socket |false
socket_create_listen()创建一个新的
此函数旨在简化创建仅侦听接受新连接的新套接字的任务。
参数
- $port
在所有接口上侦听的端口。
- $backlog
该$backlog参数定义了待处理连接队列可能增长到的最大长度。
SOMAXCONN可以作为参数传递,有关更多信息,请参阅socket_listen()。
返回值
- 成功时,返回一个新的 Socket实例。php8.0 版本之前,返回了一个资源。
- 错误时,返回
false 。可以使用socket_last_error()检索错误代码。可以将此代码传递给socket_strerror()以获取错误的文本解释。
注释
Note:如果你想创建一个只监听某个接口的socket连接,你需要使用
socket_create()、socket_bind()和socket_listen()。
参见
socket_create()创建一个套接字(通讯节点)socket_create_pair()创建一对不可区分的套接字并将它们存储在一个数组中socket_bind()给套接字绑定名字socket_listen()侦听套接字上的连接socket_last_error()返回套接字上的最后一个错误socket_strerror()返回一个描述套接字错误的字符串
If you specify no port number, or 0, a random free port will be chosen.
To use ports for ipc between client/server on the same machine you can use (minus error checking)
server.php:
<?php
$sock = socket_create_listen(0);
socket_getsockname($sock, $addr, $port);
print "Server Listening on $addr:$port\n";
$fp = fopen($port_file, 'w');
fwrite($fp, $port);
fclose($fp);
while($c = socket_accept($sock)) {
/* do something useful */
socket_getpeername($c, $raddr, $rport);
print "Received Connection from $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);
?>
Please note that port 1 to and with 1024 on linux and bsd system require root privileges. So it is recommended to choose a higher port for your own application.
Remember that ports are only valid from 1 - 65535 [editor's note: typo fixed, thanks abryant at apple dot com]
I believe that on some systems this may not bind to some or all public interfaces. On my Windows system, I could not connect on the public interface using this, but could when I made the individual calls to create, bind, and listen. Dustin Oprea
