Server->addListener
最后更新于:2022-04-02 06:19:47
# Server->addListener
[TOC]
增加监听的端口。业务代码中可以通过调用[Server->getClientInfo](Server-getClientInfo.md)来获取某个连接来自于哪个端口。
函数原型:
~~~
function Server->addListener(string $host, int $port, $type = SWOOLE_SOCK_TCP);
~~~
* 监听`1024`以下的端口需要`root`权限
* 主服务器是`WebSocket`或`Http`协议,新监听的`TCP`端口默认会继承主`Server`的协议设置。必须单独调用set方法设置新的协议才会启用新协议[查看详细说明](监听端口.md "连接")
## 返回值
* 监听端口失败,返回`false`,可调用`getLastError`方法获取错误码
* 监听成功后会返回`Swoole\Server\Port`对象,在此对象上可以为此端口单独设置事件回调函数和运行参数
## 支持的 Socket 类型
* **SWOOLE\_TCP**/**SWOOLE\_SOCK\_TCP**tcp ipv4 socket
* **SWOOLE\_TCP6**/**SWOOLE\_SOCK\_TCP6**tcp ipv6 socket
* **SWOOLE\_UDP**/**SWOOLE\_SOCK\_UDP**udp ipv4 socket
* **SWOOLE\_UDP6**/**SWOOLE\_SOCK\_UDP6**udp ipv6 socket
* **SWOOLE\_UNIX\_DGRAM**unix socket dgram
* **SWOOLE\_UNIX\_STREAM**unix socket stream
> `Unix Socket`模式下`$host`参数必须填写可访问的文件路径,`$port`参数忽略
> `Unix Socket`模式下,客户端`$fd`将不再是数字,而是一个文件路径的字符串
> `SWOOLE_TCP`等是`1.7.0`后提供的简写方式,与`SWOOLE_SOCK_TCP`是等同的
您可以混合使用`UDP/TCP`,同时监听内网和外网端口。
示例:
~~~
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP);
$serv->addlistener("192.168.1.100", 9503, SWOOLE_SOCK_TCP);
$serv->addlistener("0.0.0.0", 9504, SWOOLE_SOCK_UDP);
//UnixSocket Stream
$serv->addlistener("/var/run/myserv.sock", 0, SWOOLE_UNIX_STREAM);
//TCP + SSL
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP | SWOOLE_SSL);
~~~
## IPv4与IPv6
* IPv4使用 127.0.0.1表示监听本机,0.0.0.0表示监听所有地址
* IPv6使用::1表示监听本机,:: (0:0:0:0:0:0:0:0) 表示监听所有地址
* **Linux系统下监听IPv6端口后使用IPv4地址也可以进行连接**
## 随机监听端口
`1.9.6`增加了随机监听端口的特性,`$port`参数可以设置为0,操作系统会随机分配一个可用的端口进行监听。可以读取`$listen_port->port`获取分配到的端口号。
~~~
$port = $serv->addListener("0.0.0.0", 0, SWOOLE_SOCK_TCP);
echo $port->port;
~~~
';