# xray.router 提供[路由脚本](../guide/routing.md)使用的常量和辅助接口。请求参数与上下文见[路由 Hook](./hook-routing.md)。 ```lua local router = require("xray.router") ``` ## API 索引 | 分类 | 成员 | 说明 | | ---- | ---------------------------------------------------------- | ---------------------- | | 常量 | [`router.NetworkUnknown`](#常量) | 未知网络 | | 常量 | [`router.NetworkTCP`](#常量) | TCP | | 常量 | [`router.NetworkUDP`](#常量) | UDP | | 常量 | [`router.NetworkUNIX`](#常量) | UNIX | | 常量 | [`router.LocalOS`](#常量) | 运行平台 | | 函数 | [`router:PickOutbound(balancerTag)`](#router-pickoutbound) | 通过负载均衡器选择出站 | | 函数 | [`router.FindProcess(ctx)`](#router-findprocess) | 查找本地连接对应的进程 | ## 常量 | 名称 | 类型 | 值 / 说明 | | ----------------------- | -------- | ----------------------------------------------------- | | `router.NetworkUnknown` | `number` | `0`,未知网络 | | `router.NetworkTCP` | `number` | `2`,TCP | | `router.NetworkUDP` | `number` | `3`,UDP | | `router.NetworkUNIX` | `number` | `4`,UNIX | | `router.LocalOS` | `string` | 当前运行平台,例如 `"windows"`、`"linux"`、`"darwin"` | 可将[路由 Hook](./hook-routing.md#handleroute) 的 `network` 参数与网络常量比较: ```lua if network == router.NetworkUDP then return "direct", "lua-udp" end ``` ## 函数 ### router:PickOutbound ```lua local outboundTag, err = router:PickOutbound(balancerTag) ``` 通过指定的负载均衡器选择出站。 **参数** | 参数 | 类型 | 说明 / 要求 | | ------------- | -------- | --------------------------------------------------------------------------------------------------------- | | `balancerTag` | `string` | 要使用的负载均衡器的 `tag` 值,在 [`routing.balancers`](../../../config/routing.md#balancerobject) 中配置 | **返回值** | 返回值 | 类型 | 说明 | | ------------- | ----------------------------------------- | ---------------------------- | | `outboundTag` | `string` 或 `nil` | 成功时为选中出站的非空 `tag` | | `err` | [`error`](./data-types.md#error) 或 `nil` | `nil` 表示成功 | **行为约定** 必须显式传入字符串,否则抛出 Lua 异常。空字符串 `""` 会按空 `tag` 查找。 使用结果前应先检查 `err`。负载均衡器不存在时返回 `nil, err`;存在但未选出出站时返回 `"", err`。配置的 `fallbackTag` 生效时,返回该出站标识和 `nil`。 **示例** 下面使用 `tag` 为 `"proxy-pool"` 的负载均衡器,并按[路由 Hook 的返回值约定](./hook-routing.md#返回值)传递结果: ```lua local outboundTag, err = router:PickOutbound("proxy-pool") return outboundTag, "lua-balance", err ``` 完整示例见[路由脚本指南](../guide/routing.md#与路由配置的关系)。 ### router.FindProcess ```lua local pid, name, path, err = router.FindProcess(ctx) ``` 查找本机上与当前连接对应的进程。 **参数** | 参数 | 类型 | 说明 / 要求 | | ----- | ------------------------------------------------------ | ---------------------------------- | | `ctx` | [`routing.Context`](./hook-routing.md#routing-context) | 当前请求的上下文,由路由 Hook 传入 | **返回值** | 返回值 | 类型 | 说明 | | ------ | ----------------------------------------- | ------------------------------- | | `pid` | `number` | 进程 ID;未取得时通常为 `0` | | `name` | `string` | 进程名称;未取得时为 `""` | | `path` | `string` | 可执行文件路径;未取得时为 `""` | | `err` | [`error`](./data-types.md#error) 或 `nil` | `nil` 表示成功 | **行为约定** 须显式传入有效的路由上下文,否则抛出 Lua 异常。没有来源 IP、网络类型不是 TCP/UDP、查找失败或平台不支持时,返回错误。 `pid`、`name`、`path` 始终非 `nil`,但失败时可能保留部分信息,使用前应先检查 `err`。没有来源 IP 或网络类型不受支持时,返回 `0, "", "", err`;其他情况原样返回平台查找器的结果。 查询使用首个来源 IP 和来源端口;有目标 IP 时,同时传入首个目标 IP 和目标端口。具体匹配方式由平台查找器决定。 查找能力取决于运行平台和权限。Windows、Linux 和 macOS 提供内置实现;Android 需由运行环境注册查找器,成功时也可能没有名称或路径。iOS 和其他不支持的平台返回错误。 **示例** ```lua local pid, name, path, err = router.FindProcess(ctx) if err == nil and name == "curl" then return "direct", "lua-process" end ```