工程参考/服务端外网设置:修订间差异

来自天龙知识库
跳到导航跳到搜索
雪舞留言 | 贡献
新增服务端外网手工设置说明,核对局域网、公网地址、端口映射及连接排查;补充工程参考入口
 
雪舞留言 | 贡献
补充 Game.exe -fl 快捷方式启动,说明目标、起始位置及避免登录器覆盖手工区服列表的条件
 
(未显示同一用户的1个中间版本)
第3行: 第3行:
[[首页|首页]] · [[Lua接口/服务端函数索引|服务端接口]]
[[首页|首页]] · [[Lua接口/服务端函数索引|服务端接口]]


本文说明如何手工修改服务器和客户端配置,使玩家能够通过局域网或公网进入游戏。适用于采用下述配置格式、Login 与 GameServer 分别提供登录和游戏端口的部署;操作不依赖环境管理工具。
这篇说明适合已经能在服务器本机正常玩游戏,现在想让同一路由器下的朋友,或互联网上的朋友连接进来的人。操作使用文本编辑器和系统网络设置,不需要安装环境管理工具。


'''服务端各进程与数据库运行在同一台 Windows 主机、一个游戏进程和一个登录进程、使用一个对外 IPv4 地址'''为主例。多机、多游戏进程和独立代理部署见后文。网络可达性还取决于路由、防火墙和服务状态,必须完成实际登录、进场景验证。
本文以'''所有服务端程序和数据库都在同一台 Windows 电脑上'''为例,使用一个登录程序和一个游戏程序。先完成局域网设置,确认另一台电脑能玩,再做公网设置。配置格式不同、服务分散在多台电脑上的情况,见后面的进阶说明。


[[#先看要改哪些配置|配置清单]] · [[#局域网设置|局域网]] · [[#公网设置|公网]] · [[#公网和局域网同时访问|内外网同时访问]] · [[#验证与排查|验证与排查]]
[[#先看要改哪些配置|配置清单]] · [[#局域网设置|局域网]] · [[#公网设置|公网]] · [[#公网和局域网同时访问|内外网同时访问]] · [[#验证与排查|验证与排查]]


== 先看要改哪些配置 ==
== 先看要改哪些配置 ==
客户端先连接 Login;选择角色进入游戏时,Login 再下发 GameServer 的地址和端口。'''只改客户端登录地址,或只开放登录端口,都不足以保证进入游戏。'''
主要修改'''两份不同的文件'''。一份在服务器电脑上,另一份在每位玩家的游戏客户端里。


{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 位置
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 文件在哪里
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 应该填写什么
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 这份文件负责什么
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">tlbb/Server/Config/ServerInfo.ini</code> 的 <code style="white-space:normal;overflow-wrap:anywhere;">&#91;Server0&#93; IP0 / Port0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | '''服务器电脑''':<code style="white-space:normal;overflow-wrap:anywhere;">tlbb/Server/Config/ServerInfo.ini</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 本例游戏进程对玩家公布的地址、游戏 TCP 端口,示例端口 14401。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 告诉客户端应该连接哪些登录、游戏地址。IP0、IP(CNC)、IP(CTC)、IP(EDU) 及对应 Port 都在这份文件里修改。
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini</code> 的 <code style="white-space:normal;overflow-wrap:anywhere;">&#91;Server1&#93; IP0 / Port0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | '''玩家电脑''':<code style="white-space:normal;overflow-wrap:anywhere;">Client/Patch/LoginServer.txt</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 本例登录进程公布的地址、登录 TCP 端口,示例端口 14400。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 客户端显示区服列表并发起登录时读取它。里面是一行一行的区服记录,填写“IP:登录端口”,没有 [Server0] 或 IP(CNC)= 这样的配置。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 上述两个节的 <code style="white-space:normal;overflow-wrap:anywhere;">IP(CNC)、IP(CTC)、IP(EDU)</code> 及对应 Port
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 选中运营商线路时可能返回的地址。单一入口部署统一为同一可达 IP;游戏节填游戏端口,登录节填登录端口。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Client/Patch/LoginServer.txt</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 目标区服行中的登录地址,格式为 IPv4:登录端口。常见行有三个已填地址和一个空的第四地址字段。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务器防火墙、云安全组或路由器
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 允许玩家到达实际登录、游戏 TCP 端口。路由器 NAT 要分别映射两项。
|}
|}


路径以实际部署目录为准:服务端配置是'''运行中的 Server.exe、Login.exe 所使用的 Config 目录''';源码树中的 resources/Server/Config 是资源副本,单改资源副本不会自动改变已部署服务。客户端也必须修改玩家实际启动的那一份 Client/Patch/LoginServer.txt,并关闭后重新打开客户端。
如果你在服务器电脑上也启动客户端测试,两个文件虽然在同一台电脑上,仍然需要分别修改。给朋友的客户端也要带上改好的 LoginServer.txt;只修改服务器电脑上自己的客户端,朋友那一份不会自动更新。


=== 先确认节名与进程对应关系 ===
=== 为什么要分别改两份文件 ===
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
# 玩家选择区服,客户端从 LoginServer.txt 读取登录地址,例如 '''192.168.50.10:14400''',连接登录程序 Login。
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 本例配置
# 玩家选择角色,Login 根据 ServerInfo.ini 告诉客户端游戏地址,例如 '''192.168.50.10:14401'''。
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 含义与核对方法
# 客户端再连接游戏程序 Server,进入场景。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">&#91;Server0&#93; ServerID=0, Type=0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | GameServer。Type=0 表示游戏服务;示例 CurrentServerID=0。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">&#91;Server1&#93; ServerID=2, Type=1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Login。Type=1 表示登录服务;LoginInfo.ini 的 [System] LoginID=2 指向此 ServerID。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Server1</code> 与 <code style="white-space:normal;overflow-wrap:anywhere;">ServerID=2</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 节序号 1 不等于服务 ID 2。不要为了改 IP 而重编号。
|}
若你的区服布局不同,应按 Type、ServerID、LoginID 和实际启动配置定位相应节,不能机械套用 Server0/Server1。保留 ServerNumber、MachineID、共享内存键及其他业务参数。


== 地址与端口的区别 ==
所以“能登录账号”和“能进入游戏”是两次不同的连接。只改 LoginServer.txt,可能能看到角色,却在进入场景时连接失败。
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 地址或字段
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 如何使用
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 回环地址,指发起连接的电脑自己。可用于同机服务通信;发给其他玩家时会指向玩家自己的电脑。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">192.168.50.10</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 本文假设的服务器局域网地址,应替换为服务器实际网卡 IPv4。可用 ipconfig 查看,并通过固定地址或 DHCP 保留保持稳定。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">203.0.113.10</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 本文的公网说明地址,不能用于真实连接。实际配置必须换成分配给你的公网 IPv4 或公网转发入口。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">0.0.0.0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 监听表中通常表示本机所有 IPv4 接口,不是让玩家连接的地址。不同配置字段对它的解释不同,不要统一理解为“自动检测 IP”或“禁用”。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">IP0 / Port0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | IP0 是公布给客户端的默认地址;当前 Login 和 GameServer 使用 Port0 建立 TCP 监听,默认也把 Port0 下发给客户端。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">IP1 / Port1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务端内部配置字段,不是给局域网玩家另开的一套登录/游戏入口。把 IP1 改成局域网地址不会替代对 IP0 的设置。
|}
当前网络代码用 IPv4 TCP,并在 INADDR_ANY 上绑定 Port0,实际监听通常显示 0.0.0.0:14400 和 0.0.0.0:14401。因此 NAT 部署时,IP0 可以填路由器的公网地址,服务器网卡仍保留它自己的内网地址;不要把路由器的公网 IP 硬填到内网服务器网卡上。本文使用数字 IPv4,域名和 IPv6 不作为已验证方案。


端口须为 1 至 65535 的整数;同机 Login 与 GameServer 不能争用同一监听端口,也不能与 World、Billing、数据库或其他程序冲突。本文使用资源配置中的 14400/14401,实际改端口后,服务端、客户端、线路字段及转发规则都必须同步。
这里的 '''IP''' 是要连接的电脑地址,'''端口''' 用来区分这台电脑上的不同服务。例如 192.168.50.10:14400 中,冒号前是 IP,冒号后是端口。本例 '''14400 用于登录,14401 用于游戏''';客户端 LoginServer.txt 中的地址全部使用登录端口 14400。


=== 同机部署通常保留的内部配置 ===
== 修改前的准备 ==
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
# 先确认在服务器本机能正常登录并进入场景。如果本机也不能玩,先处理原有启动或账号问题。
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 位置
# 用平时的正常停服方式关闭服务端,等角色数据保存、ShareMemory 完成保存后再操作;同时关闭客户端。不要直接在任务管理器中强行结束保存程序。
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 本例值与处理
# 各复制一份 ServerInfo.ini 和 LoginServer.txt 作为备份。编辑时保留原有文本编码;编辑器若显示 GBK 或 GB18030,保存时继续使用原编码。
|-
# 找准实际运行的文件:服务端打开 Server.exe、Login.exe 所使用的 Config 文件夹;客户端打开你实际启动的那份游戏的 Patch 文件夹。不要只改源码目录 resources 里的样本文件。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;World&#93; IP / Port</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 777</code>,供服务进程连接 World。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Billing&#93; IP0 / Port0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 10101</code>,此处 IP0 是 Billing 服务地址,不是游戏客户端入口。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Server0&#93; IP1 / Port1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 8880</code>,保留内部配置。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Server1&#93; IP1 / Port1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 8882</code>,保留内部配置。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">LoginInfo.ini、ShareMemInfo.ini、BillingInfo.ini</code> 的 <code style="white-space:normal;overflow-wrap:anywhere;">&#91;System&#93; DBIP / DBPort</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 3306</code>,数据库同机时保留;若已使用其他数据库端口,继续使用实际值。
|}
以上是资源文件的示例值,不是端口开放清单。'''服务连接到 127.0.0.1,不等于对应进程只监听回环接口''';实际监听以系统查询为准。玩家只需访问登录、游戏入口,World、Billing、数据库及管理端口应限制在需要它们的主机或内部网络内。


== 修改前的准备 ==
'''下面的配置片段都用于修改原文件中的对应项目,不能拿它们覆盖整个文件。'''文件里的其他配置继续保留。
# 确认当前服务端已能按原有方式完成正常登录,避免将数据库、资源加载或程序启动问题误判为外网配置问题。
# 正常停服并等待角色数据保存、ShareMemory 落盘完成,再修改配置;关闭正在使用的客户端。使用已有的手工停服方式,避免直接强杀保存进程。
# 备份将要修改的 ServerInfo.ini、LoginServer.txt;如需修改 LoginInfo.ini,也先备份。保存原编码、换行、节名和其他参数,尤其不要把原有 GBK/GB18030 文件无意转成另一编码。
# 记录服务器内网 IP、玩家使用的入口 IP、登录端口、游戏端口,以及是否经过路由器、虚拟机 NAT、云安全组。下面示例只用于修改对应键或行,不能覆盖整个配置文件。


== 局域网设置 ==
== 局域网设置 ==
假设服务器的局域网 IPv4 为 192.168.50.10,玩家电脑可以路由到它,所有服务进程和数据库仍在服务器同一台主机上。
局域网例子:服务器和朋友的电脑接在同一个家庭路由器下。先在'''服务器电脑'''按 Win+R,输入 cmd 并回车,再输入:


=== 1. 修改服务端对外配置 ===
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">ipconfig</pre>
ServerInfo.ini 找到原有的两个节,逐项替换以下值;保留节内未列出的其他字段,'''不要在文件末尾追加重复的节或键'''。
 
找到当前联网的“以太网”或“无线局域网”适配器,记下它的 '''IPv4 地址'''。假设查到的是 '''192.168.50.10''',下文就用这个地址演示;如果你查到 192.168.1.20,应把示例里的 192.168.50.10 全部换成 192.168.1.20。
 
不要抄“默认网关”,那通常是路由器的地址;也不要填朋友电脑的 IP。若服务端在虚拟机里,需在虚拟机里查询,并先看 [[#虚拟机或多台服务器|虚拟机说明]]。
 
=== 第一步:在服务器电脑修改 ServerInfo.ini ===
打开 '''tlbb/Server/Config/ServerInfo.ini'''。用编辑器查找 '''[Server0]''' 和 '''[Server1]''':这种用方括号括住的名称表示一组配置,也叫“节”。从这个名称往下,到下一个方括号名称之前,都属于这一组。
 
本例 [Server0] 中有 '''Type=0、ServerID=0''',是游戏服务;[Server1] 中有 '''Type=1、ServerID=2''',是登录服务。如果你的文件不是这种对应关系,先看 [[#配置编号不同怎么办|配置编号说明]],不要按序号猜。已有的 Type、ServerID 等行都保留原值。
 
==== A. 同一个 ServerInfo.ini 文件里的 [Server0]:游戏地址 ====
在原有 [Server0] 下面,把以下 IP 项改为服务器的局域网 IP;这里的四个端口都使用 '''游戏端口 14401'''。


<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">&#91;Server0&#93;
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">&#91;Server0&#93;
第119行: 第67行:
Port(CTC)=14401
Port(CTC)=14401
IP(EDU)=192.168.50.10
IP(EDU)=192.168.50.10
Port(EDU)=14401
Port(EDU)=14401</pre>
 
==== B. 仍在 ServerInfo.ini 文件里的 [Server1]:登录地址 ====
继续找到原有 [Server1],把以下 IP 项改为同一个局域网 IP;这一组的四个端口都使用 '''登录端口 14400'''。


&#91;Server1&#93;
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">&#91;Server1&#93;
IP0=192.168.50.10
IP0=192.168.50.10
Port0=14400
Port0=14400
第131行: 第82行:
Port(EDU)=14400</pre>
Port(EDU)=14400</pre>


这里将单一入口的运营商地址也统一设置,避免玩家切换线路后得到旧 IP、0.0.0.0 或错误端口。已有独立代理、多运营商地址的部署应分别填写真实入口,不能用这个单入口示例覆盖原有代理设计。
两个片段之间原来还有其他配置,全部保留;不要重复添加 [Server0] 或 [Server1]。本文假设登录和游戏都在同一台电脑,并且没有另设代理服务器,所以两组 IP 相同,端口不同。


=== 2. 修改每份客户端的目标区服行 ===
==== IP(CNC)、IP(CTC)、IP(EDU) 到底是什么 ====
Client/Patch/LoginServer.txt SERVER_BEGIN 与 SERVER_END 之间找到实际要进入的区服。本例只修改“天下第一”这一行的地址,保留它原有的其他字段:
'''这些都是服务端 ServerInfo.ini 的项目,不写进客户端 LoginServer.txt。'''它们用于玩家选择不同运营商线路时返回相应地址,分别与 Port(CNC)、Port(CTC)、Port(EDU) 配对;IP0 与 Port0 则是默认地址和端口。
 
如果你的服务器只有一个可供朋友连接的地址,四个 IP 项都写这个地址即可。[Server0] 的四个 Port 项写 14401,[Server1] 的四个 Port 项写 14400。这样无论选择哪条线路,都能得到同一台服务器的正确端口。'''不要把 IP(CNC) 理解成公网 IP、IP(CTC) 理解成内网 IP。'''
 
这些线路项目若还留着旧 IP 或 0.0.0.0,可能在切换线路后连接失败;源码中 0.0.0.0 不代表关闭线路。原因放在后文的进阶说明中。
 
==== 哪些 IP 这次先不改 ====
所有服务端程序和数据库都在同一台电脑时,保留原有 '''IP1、Port1、[World]、[Billing] 和数据库 DBIP/DBPort'''。它们主要用于服务程序之间的通信。尤其不要使用“全部替换”,把文件中所有 127.0.0.1 都改掉。
 
改完后核对:游戏组是你的 IP 加 14401,登录组是你的 IP 加 14400;这一步只改了 '''ServerInfo.ini''',还没有修改客户端。
 
=== 第二步:在玩家电脑修改 LoginServer.txt ===
关闭游戏,用编辑器打开 '''Client/Patch/LoginServer.txt'''。这是另一份文件,里面按行列出区服名称和登录地址。
 
SERVER_BEGIN 与 SERVER_END 之间找到你要进入的区服,例如“天下第一”。保留这行前面的区组名、区服名、数字和提示文字,只改后面的地址。原来三个 '''127.0.0.1:14400''',都改为 '''192.168.50.10:14400'''。
 
以下是本例修改后的完整一行;如果你的前半行内容不同,保留你自己的前半行:


<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">华东电信一区,天下第一,0,101,3,0,0,WELECOME TO TLBB,192.168.50.10:14400,192.168.50.10:14400,192.168.50.10:14400,</pre>
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">华东电信一区,天下第一,0,101,3,0,0,WELECOME TO TLBB,192.168.50.10:14400,192.168.50.10:14400,192.168.50.10:14400,</pre>


这是一条完整记录,必须保存在'''同一物理行''';页面自动换行不表示文件中要换行。使用英文半角逗号和冒号,不要加引号、空格、http:// 或把游戏端口 14401 写进登录地址。
一条区服记录在文件中必须保持'''一行'''。网页显示时可能自动折行,保存时不要在中间按回车。使用英文半角逗号和冒号,地址两边不要加引号或空格。
 
==== “三个地址和空的第四地址”是什么意思 ====
看这行末尾的地址部分:
 
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">192.168.50.10:14400,192.168.50.10:14400,192.168.50.10:14400,</pre>
 
* 第一个地址:192.168.50.10:14400。
* 第二个地址:192.168.50.10:14400。
* 第三个地址:192.168.50.10:14400。
* 第四个地址:本例没有填写,'''第三个地址后面的最后一个逗号要保留'''。
 
这几个位置都是'''登录地址''',供客户端选择线路时使用,不是分别填写“登录、游戏、公网、内网”。单个服务器地址的例子,三个位置都填一样即可;不要把其中一个改成游戏端口 14401。
 
逗号用于分隔项目。行尾逗号表示还有一个空项目,当前客户端依靠它读到足够的项目数量;删掉这个逗号,本例区服可能直接不显示。原文件若已经填了第四个地址,也将它改为有效的登录地址;原有额外数字或路由设置先保留,见 [[#客户端行格式的补充|行格式说明]]。
 
保存后把改好的文件放进'''每位玩家实际启动的那份客户端的 Patch 文件夹''',再重新启动客户端。其他区服记录保持原样。
 
==== 用快捷方式直接启动游戏,保留手工设置的 IP ====
如果你还没有把 Launch.ini 中的更新地址、区服列表地址配置成自己的,手工改好 LoginServer.txt 后,可以用 '''Game.exe -fl''' 的快捷方式直接启动游戏。这种启动方式不需要先配置 Launch.ini。
 
原因是:Launch.exe 是登录器和更新程序;Game.exe 才是游戏本体。Launch 的更新流程会根据 Launch.ini 的 [Launch] LoginServer 地址下载列表,写入 Client/Patch/loginserver.txt。在通常的 Windows 文件系统上,它与 LoginServer.txt 是同一份文件,手工填写的 IP 就可能被下载内容覆盖。
 
'''要避开的是 Launch 的更新流程。'''直接启动 Game.exe 不经过这段流程;-fl 是游戏识别“从登录器启动”的参数,Launch 自己启动游戏时也会带上它。它不是把 LoginServer.txt 设为只读的开关,再运行登录器或其他更新工具,文件仍可能被覆盖。
 
在'''玩家电脑'''按下面操作:
 
# 关闭游戏和已经打开的 Launch 登录器,先备份并确认 Client/Patch/LoginServer.txt 中是自己设置的 IP。
# 找到实际使用的 Game.exe。常见 32 位程序位于 '''Client/Bin/Game.exe''',64 位程序位于 '''Client/Bin64/Game.exe''';选择已经能在这台电脑上正常运行的那一份,不需要同时建两个快捷方式。
# 右键 Game.exe,选择“发送到 → 桌面快捷方式”;Windows 11 可能需要先点“显示更多选项”。
# 右键桌面上的快捷方式,打开“属性”,切换到“快捷方式”选项卡。
# 在“目标”中保留 Game.exe 的完整路径,在路径结束的引号'''外面加一个空格,再加 -fl'''。使用英文半角连字符、小写 f 和小写字母 l,最后不是数字 1。
# 将“起始位置”设为这个 Game.exe 所在的文件夹,点击“应用”“确定”。以后用这个快捷方式启动游戏。
 
例如,你的客户端放在 '''D:\Games\TLBB\Client''',使用 Bin 下的 Game.exe,快捷方式“目标”填写:
 
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">"D:\Games\TLBB\Client\Bin\Game.exe" -fl</pre>
 
同一个快捷方式的“起始位置”填写:
 
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">"D:\Games\TLBB\Client\Bin"</pre>
 
上面是'''快捷方式属性里的两个输入框''',不是让你把两行都写到配置文件,也不是文件名。路径要换成自己电脑上的实际路径;不要把参数写成 <code style="white-space:normal;overflow-wrap:anywhere;">"Game.exe -fl"</code>,不要把 Game.exe 重命名。
 
使用 Bin64 的 Game.exe 时,将“目标”改为对应的 Bin64/Game.exe,并将“起始位置”同步改为 Bin64 文件夹。程序依赖相对路径找资源,例如从 Bin 或 Bin64 读取上一级 Patch/LoginServer.txt,所以“起始位置”不能随意填桌面或 Client 根目录。
 
第一次用快捷方式启动后,核对区服列表和实际连接;退出游戏,再用编辑器查看同一份 LoginServer.txt,确认 IP 没有被覆盖。如果仍提示“请从 Launch.exe 运行游戏”,先核对参数是否在引号外、是否确为 -fl,以及快捷方式是否指向正确的 Game.exe。
 
直启会跳过本次登录器的更新、修复和客户端位数选择流程。前提是游戏资源及运行环境已齐全、客户端与服务端匹配;-fl 不能补齐缺少的文件,也不能修复网络不通。以后需要运行 Launch 更新时,先备份自己的列表并核对更新来源,更新后再检查 IP。不同来源或不同编译配置的 Game.exe 对参数检查可能不同,实际启动及文件保留效果'''需要实测'''。
 
=== 第三步:在服务器电脑允许两个端口通过防火墙 ===
这一步让别的电脑能访问登录和游戏程序。'''在服务器电脑上'''按 Win+R,输入 <code style="white-space:normal;overflow-wrap:anywhere;">wf.msc</code> 并回车,打开“高级安全 Windows 防火墙”:
 
# 点击“入站规则”,再点“新建规则”。
# 规则类型选择“端口”。
# 选择“TCP”,在“特定本地端口”中填写 '''14400,14401'''。
# 选择“允许连接”。
# 勾选服务器当前联网连接使用的配置文件。Windows 网络属性显示“专用”就需勾选“专用”,显示“公用”就需勾选“公用”;不确定时先在系统网络设置中确认。
# 给规则起名,例如“TLBB 登录与游戏”,保存规则。
 
纯局域网使用时,可在规则属性的“作用域”中将远程 IP 限制为实际玩家地址或网段。后来开放公网时,也要重新确认这个范围允许外网玩家;云服务器还要设置后文的云安全组。不要为了测试而关闭整个防火墙。
 
如果仍然不通,检查玩家是否连到访客 Wi-Fi,路由器是否启用了“客户端隔离”;这些功能可能不允许两台电脑互相连接。
 
=== 第四步:启动服务,用另一台电脑进游戏 ===
按平时手工开服的流程启动。依赖顺序为:数据库就绪,再依次启动 ShareMemory、Billing、World、Login、Server;每一步确认正常后再继续。这次只改网络地址,原有启动参数保持不变。
 
从同一路由器下的'''另一台玩家电脑'''打开改好的客户端,选择目标区服,登录账号、选择角色并进入场景。能进入并正常移动,才算完成局域网这一步;只在服务器本机测试不足以证明朋友也能连。失败时按 [[#验证与排查|验证与排查]] 检查,不要急着继续改公网。
 
== 公网设置 ==
公网就是让不在你家局域网里的朋友,通过互联网连接进来。家用路由器部署通常需要两个地址:'''服务器的内网 IP''' 和 '''宽带的公网 IP'''。


{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 从 1 开始数的字段
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 本例地址
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 用途
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 填在什么地方
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 第 1 至 8 项
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">192.168.50.10</code>:服务器内网 IP
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 区组名、区服名及原有区服属性等;本次保持原值,不把 ServerID 填进这些位置。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务器网卡继续使用它;路由器把收到的连接转发到这个地址。
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 第 9、10、11 项
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">203.0.113.10</code>:假设的公网 IP
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 本例三个已填写的登录地址,全部指向同一个 Login 入口。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务端向玩家提供的地址、玩家客户端的登录地址改为它。此地址仅供文档举例,必须换成自己的真实公网 IP。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 第 12 项
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 第四个登录地址。本例为空,由第三个地址后面的行尾逗号保留;当前客户端要求至少 12 项,删掉逗号会使此示例变成只有 11 项并被跳过。
|}
|}
如果第四项原本有地址,也必须核对并更新为你的有效登录入口;如果有额外路由字段,保留并按实际客户端规则核对。不要添加与网络设置无关的字段,不要修改其他人的区服记录。三个地址不是“公网、内网、游戏地址”的固定分工;客户端按线路选择它们,不能靠随意混填公网/内网实现自动识别。


=== 3. 放行服务器防火墙并启动 ===
=== 第一步:确认你有能接收连接的公网 IP ===
在 Windows 高级安全防火墙中为实际服务端设置入站允许规则:TCP,本例本地端口 14400、14401;规则应用到当前网卡所属配置文件。纯局域网使用时,可以把远程地址范围限制为实际玩家网段;跨网段或 VPN 客户端也要包含在允许范围内。保留防火墙开启,不以关闭整个防火墙代替规则。
家用路由器:进入路由器管理页面,查看“上网设置”或“WAN 状态”的 IPv4 地址。'''WAN''' 指路由器连接宽带的那一侧。向运营商确认这条宽带是否分配了可接收入站连接的公网 IPv4;网页上查到一个出口 IP,不能证明你能在这个 IP 上开放游戏端口。


检查无线网络是否启用了访客网络或客户端隔离;虚拟机桥接应填写虚拟机自己的局域网 IP,虚拟机 NAT 则还需要宿主机转发。服务端按原有手工流程启动:数据库就绪,再依次启动 ShareMemory、Billing、World、Login、Server,确认各进程及依赖就绪后启动客户端。执行后文的局域网验证。
如果 WAN 地址落在以下范围,它仍是内部地址,不能直接填给外网朋友使用:


== 公网设置 ==
* 10.0.0.0 到 10.255.255.255。
公网示例仍以服务器内网地址 192.168.50.10、登录 14400、游戏 14401 为例,假设公网入口是 203.0.113.10。'''203.0.113.10 是文档专用示例,实际操作必须替换。'''
* 172.16.0.0 到 172.31.255.255。
* 192.168.0.0 到 192.168.255.255。
* 100.64.0.0 到 100.127.255.255。
 
这可能是光猫还在做一层转发,也可能是运营商没有给你独立公网地址。没有可控制的公网入口时,单改游戏配置无法解决,需要先处理宽带地址,或另行配置公网转发/VPN;具体网络效果需要实测。


=== 1. 先确认公网入口 ===
云服务器:在云控制台找到这台实例的“公网 IP”或“弹性公网 IP(EIP)”,使用它作为玩家连接地址。后面的路由器操作改为云控制台的“安全组”设置。
* 家用路由器后:确认路由器取得可入站访问的公网 IPv4;宽带运营商必须允许相关入站连接。网页查询到的出口 IP,不等于你拥有该地址的端口映射权限。
* WAN 地址为 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 或 100.64.0.0/10 时,该地址不是可直接分配给公网玩家使用的公网入口。它可能处于上级路由或运营商 NAT 后,要继续确认上游。
* 光猫和路由器双重 NAT:每一层都要把两个 TCP 端口继续转发到下一层,或者调整为已有的可达网络拓扑。
* 云服务器:使用实例的公网/EIP,放行云安全组和主机防火墙;部分云平台将公网地址映射到内网网卡,无需手工给网卡配置 EIP。
* 没有可控的公网入站地址:需要运营商分配公网地址,或部署能转发这两个 TCP 入口的公网中继。也可让所有玩家加入可互通的 VPN,按局域网方式使用 VPN 地址;中继/VPN 的具体路由与效果需要实测。


=== 2. 改为公网公布地址 ===
=== 第二步:在服务器电脑把 ServerInfo.ini 改为公网地址 ===
把局域网示例中两个节的 IP0 和三组线路 IP 改为你的公网入口;同机内部的 World、Billing、数据库及 IP1 继续使用原有内部地址。本例应替换的对外键如下:
先正常停服。仍然打开 '''tlbb/Server/Config/ServerInfo.ini''',这次把之前写的局域网 IP 改成真实公网 IP。下面依旧使用 203.0.113.10 作示例,端口保持 14400/14401。


==== A. ServerInfo.ini 的 [Server0]:公网游戏地址 ====
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">&#91;Server0&#93;
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">&#91;Server0&#93;
IP0=203.0.113.10
IP0=203.0.113.10
第181行: 第214行:
Port(CTC)=14401
Port(CTC)=14401
IP(EDU)=203.0.113.10
IP(EDU)=203.0.113.10
Port(EDU)=14401
Port(EDU)=14401</pre>


&#91;Server1&#93;
==== B. ServerInfo.ini 的 [Server1]:公网登录地址 ====
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">&#91;Server1&#93;
IP0=203.0.113.10
IP0=203.0.113.10
Port0=14400
Port0=14400
第193行: 第227行:
Port(EDU)=14400</pre>
Port(EDU)=14400</pre>


每份公网客户端的目标区服行同步改为:
只替换原有组里的这些项目,保留其他行。服务器网卡仍使用原来的内网 IP;同机内部的 IP1、World、Billing、数据库地址也保持原配置。不要把路由器的公网 IP 填到服务器的网卡设置里。
 
=== 第三步:把玩家的 LoginServer.txt 改为公网登录地址 ===
关闭客户端,打开 '''Client/Patch/LoginServer.txt''',找到同一个目标区服,把已填写的登录地址改成 '''真实公网 IP:14400'''。本例修改后的完整一行是:


<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">华东电信一区,天下第一,0,101,3,0,0,WELECOME TO TLBB,203.0.113.10:14400,203.0.113.10:14400,203.0.113.10:14400,</pre>
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">华东电信一区,天下第一,0,101,3,0,0,WELECOME TO TLBB,203.0.113.10:14400,203.0.113.10:14400,203.0.113.10:14400,</pre>


独立游戏服务器使用不同公网 IP 时,游戏节填游戏服务器入口,登录节与客户端列表填 Login 入口,不能强行共用一个 IP。
同样保留最后的逗号,所有已填地址都用登录端口 14400,并把文件同步给朋友。没有配置自己的 Launch 更新来源时,按 [[#用快捷方式直接启动游戏,保留手工设置的 IP|Game.exe -fl 快捷方式说明]] 启动,避免列表又被下载覆盖。到这一步,两份文件里的玩家连接地址已经改为公网,下面还要让路由器把连接送到服务器。


=== 3. 建立两个 TCP 映射 ===
=== 第四步:在路由器添加两条端口转发 ===
路由器常称为“端口转发”或“虚拟服务器”。如果端口可自定义,本例按相同的外部、内部端口配置:
在'''路由器管理页面'''找到“端口转发”,也可能叫“虚拟服务器”或“NAT 转发”。它的作用是:朋友访问你的公网 IP 时,路由器知道应转交给内网的哪台电脑。
 
新建'''登录'''和'''游戏'''两条规则,按下面填写。目标 IP 使用服务器的'''内网 IP''',不是公网 IP,也不是路由器自己的地址。


{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 协议与公网入口
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 路由器界面中的项目
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 转发到服务器
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 应该填写什么
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 规则名称
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 第一条叫“TLBB 登录”;第二条叫“TLBB 游戏”,名称便于自己识别。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 协议
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 两条均选择 TCP。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 内部 IP / 目标 IP / 服务器 IP
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 两条均填服务器内网 IP,本例 192.168.50.10。
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | TCP 203.0.113.10:14400
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 外部端口 / 公共端口
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 192.168.50.10:14400,Login 登录端口。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 登录规则填 14400,游戏规则填 14401。
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | TCP 203.0.113.10:14401
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 内部端口 / 本地端口
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 192.168.50.10:14401,GameServer 游戏端口。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 登录规则同样填 14400,游戏规则同样填 14401。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 启用状态
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 两条都启用并保存。
|}
|}
服务器内网 IP 要固定,否则 DHCP 变化会让转发目标失效。云端使用提供商的安全组/映射规则;公网 IP 直接配置在服务器网卡且无 NAT 时无需另加路由器端口映射,但仍须满足上游和主机防火墙要求。


'''不要只将公网 24401 映射到内网 14401,却仍让服务端公布 Port0=14401。'''默认返回地址和监听都使用 Port0,客户端会继续尝试公网 14401。本文采用内外相同端口;若改用 24401,游戏 Port0、三组线路端口、监听、防火墙及内外映射都同步使用 24401。登录端口改变还要同步修改客户端列表。固定外部端口的中继、不同端口转换或独立代理须另行核对完整返回地址,需要实测。
如果界面要求填写“起始端口”和“结束端口”,一条规则的起止端口填同一个数。例如登录规则两格都填 14400。完成后的连接关系应当是:
 
* 朋友访问 '''公网 IP:14400''',转到 '''192.168.50.10:14400'''。
* 朋友访问 '''公网 IP:14401''',转到 '''192.168.50.10:14401'''。
 
在路由器的地址分配设置中,为服务器保留固定内网 IP,避免重启后地址变化、规则却还指向旧电脑。这通常叫“DHCP 地址保留”或“静态地址分配”。不要为同一个服务器 IP 随意占用其他设备已使用的地址。
 
'''两条规则的外部和内部端口先保持相同。'''不要只把外部游戏端口改为 24401、内部仍用 14401;服务端如果还告诉客户端去连接 14401,客户端就找不到你设置的外部入口。确实需要换端口时,见 [[#想改用其他端口|改端口说明]]。
 
光猫和路由器都在做地址转发时,光猫还要把这两个端口转给路由器,路由器再转给服务器;只配置其中一层可能不通。不同设备的管理页面不同,要按真实网络连接核对。


公网玩家访问这套登录与游戏路径使用 TCP,不需要把 UDP 或所有服务端端口一起开放。账号注册网站、更新器、管理后台如有独立需求,按各自服务单独配置,不属于本文这两个游戏入口。
==== 云服务器的对应操作 ====
在云控制台找到绑定到这台服务器的'''安全组''',也就是云平台提供的一层网络防火墙,添加允许入站 TCP 14400 和 TCP 14401 的规则;来源范围应包含预期玩家的公网地址。服务器 Windows 防火墙也要允许这两个端口。若局域网步骤中限制了来源为内网地址,公网使用时需调整。
 
云平台已经把公网 IP 绑定到实例时,按该平台要求检查公网绑定或转发,无需套用家用路由器界面。公网 IP 直接配在服务器网卡、没有路由器转发的部署,也只需检查实际路径上的防火墙等规则。
 
本篇游戏连接使用 TCP。World、Billing、数据库和远程管理端口不属于玩家所需的这两个端口,不随这次操作一起开放。
 
=== 第五步:从真正的外网测试 ===
重新启动服务端,让一位不在你家 Wi-Fi 下的朋友测试,或用连接手机热点的电脑测试:选择区服、登录、选角、进入场景并移动。两台电脑仍在同一路由器下时,不能用这个结果证明真正外网可用。
 
外网不能进时,按 [[#验证与排查|验证与排查]] 分别测试 14400 与 14401。如果朋友在外面能玩、你自己在家反而进不去,继续看下一节。


== 公网和局域网同时访问 ==
== 公网和局域网同时访问 ==
单个 GameServer 默认公布一个 IP0。它不会因为玩家来自局域网就自动把 IP1 当游戏地址返回;仅给局域网玩家换一份 LoginServer.txt,只能改变第一段登录连接。
假设外面的朋友已经能用公网 IP 玩游戏,你自己在家也使用这份客户端。此时你的电脑是从局域网访问自家的公网 IP,再回到局域网服务器。路由器需要支持这种“出去再转回来”的连接,通常叫 '''NAT 回环''',英文名称为 NAT loopback 或 hairpin NAT。
 
如果路由器支持并启用它,服务端和所有客户端可以统一使用公网地址,再从家里的玩家电脑完成一次登录、进场景测试。如果不支持,可能出现“朋友能玩,我自己进不去”;这不一定是服务器配置错了。
 
'''只给自己把 LoginServer.txt 改回内网 IP,不保证能解决。'''这只改变最初的登录地址,选择角色后服务器仍会告诉客户端连接公网游戏地址。ServerInfo.ini 的 IP1 也不会自动成为给内网玩家返回的地址。


{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
第228行: 第301行:
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务端和客户端统一使用公网示例。路由器必须支持并启用 NAT loopback / hairpin NAT,让局域网玩家访问公网登录、游戏端口时正确转回内网。必须用一台局域网客户端实测两个端口及完整进游戏。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务端和客户端统一使用公网示例。路由器必须支持并启用 NAT loopback / hairpin NAT,让局域网玩家访问公网登录、游戏端口时正确转回内网。必须用一台局域网客户端实测两个端口及完整进游戏。
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 所有玩家使用同一可路由的 VPN 地址
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 所有玩家通过 VPN 组网
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 服务器公布玩家都能到达的 VPN IPv4,客户端列表也使用该地址。所有玩家均须接入 VPN;主机规则、客户端互通与回程路由需成立。这不是开放给未接入 VPN 的普通公网入口。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | VPN 可让不同地点的电脑加入一个虚拟内部网络。所有玩家和服务器都加入并能互相连接后,可按局域网步骤使用服务器的 VPN IPv4。没有加入的普通公网玩家不能直接使用这个地址,实际组网效果需要实测。
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 路由器不支持回环,且希望维持普通公网入口
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 路由器不支持回环,且希望维持普通公网入口
第237行: 第310行:


只修改 hosts、做域名内外分流,不能修正本文服务端直接下发的数字 IP;不同来源返回不同地址的代理方案需要同时核对登录、进入场景以及后续换服连接,需要实测。
只修改 hosts、做域名内外分流,不能修正本文服务端直接下发的数字 IP;不同来源返回不同地址的代理方案需要同时核对登录、进入场景以及后续换服连接,需要实测。
== 线路字段与多机部署 ==
=== 为什么需要核对运营商地址 ===
资源配置中 LoginInfo.ini 的 [System] ProxyConnect=1。当前实现会根据客户端的线路标记选择 GameServer 的 IP(CNC)、IP(CTC)、IP(EDU) 及对应端口,默认分支才回退到 IP0/Port0。'''配置解析器只要读到一对线路 IP、Port 字段就标记为启用,并不因 IP=0.0.0.0 自动禁用。'''
因此只修改两个 IP0,可能在一条线路正常、切到另一条线路后进场景失败。单一入口的做法就是将两个节的三组线路地址分别设为各自真实入口,正如前面的完整片段。保留当前可用的 ProxyConnect;它控制代理业务,不是“是否开启公网”的开关。
ServerInfo.ini 的 [Proxy] 中 Proxy0ForCncUser、Proxy0ForCtcUser、Proxy0ForEduUser 等是识别代理来源的配置。'''不要把路由器网关或普通玩家的局域网 IP 填进去充当内外网判断''',当前实现按来源 IP 字符串匹配,匹配后还受代理准入逻辑影响。这些字段和 [Server0]/[Server1] 的 IP(CNC) 等不是同一用途。
=== 多机、多游戏进程的边界 ===
* World、Billing、数据库分机时,连接它们的服务应填写实际可达的内部地址,不能继续用代表本机的 127.0.0.1;还需同步各进程配置及内部访问规则。共享内存相关进程有本机依赖,分机不属于只改 IP 的操作。
* 每个会接收玩家的游戏进程,都需要正确的客户端可达地址和独立、可达的监听端口;同机各进程端口不能冲突,路由器也须分别映射。只配置起始场景所在进程,不能证明其他服务器上的场景可进入。
* [Mother]、共享内存键、MachineID、数据库账号等不因切换公网/局域网而统一改写。现有独立代理的路线选择、端口转换和跨服表现须按本服实现继续核对,需要实测。


== 验证与排查 ==
== 验证与排查 ==
=== 1. 服务器上检查监听 ===
=== 1. 服务器上检查监听 ===
在服务器 PowerShell 执行;端口若已改变,替换为实际值:
“监听”表示程序已经启动,并在等待其他电脑连接。'''在服务器电脑上'''从开始菜单搜索并打开 PowerShell,输入以下命令;命令中的 14400、14401 要与实际设置一致:


<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">Get-NetTCPConnection -State Listen -LocalPort 14400,14401 &#124;
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">Get-NetTCPConnection -State Listen -LocalPort 14400,14401 &#124;
     Select-Object LocalAddress,LocalPort,OwningProcess</pre>
     Select-Object LocalAddress,LocalPort,OwningProcess</pre>


应看到 Login 与 Server 对应端口的监听记录。根据 OwningProcess 查询进程,确认不是其他程序占用了端口;例如将 PID 替换为查询结果:
结果应有 14400 和 14401 两个端口。LocalPort 是本地端口,OwningProcess 是占用它的程序编号(PID);LocalAddress 显示 0.0.0.0 通常表示正在本机所有 IPv4 网络接口上等待连接,属于正常情况。
 
要确认是否由正确程序占用,将下一条命令中的 1234 换成对应行的 OwningProcess 数字,再执行:


<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">Get-Process -Id 1234 &#124; Select-Object Id,ProcessName,Path</pre>
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">Get-Process -Id 1234 &#124; Select-Object Id,ProcessName,Path</pre>


1234 只是 PID 示例。显示 0.0.0.0 监听属正常情况;查询无记录或只出现一项时,先查相应进程的启动日志、加载配置位置及端口冲突。
登录端口对应 Login,游戏端口对应 Server;有些部署的程序名使用 LoginServer、GameServer。查询无记录、报未找到对象或只有一个端口时,先查该服务是否启动成功、实际读取哪个 Config 文件夹,以及是否被别的程序占用了端口。


=== 2. 从局域网玩家电脑测试 ===
=== 2. 从局域网玩家电脑测试 ===
这次到'''另一台玩家电脑'''打开 PowerShell,输入以下两条命令。将 192.168.50.10 换成服务器的实际内网 IP:
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">Test-NetConnection -ComputerName 192.168.50.10 -Port 14400
<pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">Test-NetConnection -ComputerName 192.168.50.10 -Port 14400
Test-NetConnection -ComputerName 192.168.50.10 -Port 14401</pre>
Test-NetConnection -ComputerName 192.168.50.10 -Port 14401</pre>


两项都应显示 TcpTestSucceeded: True。这个结果只证明能建立 TCP 连接,不证明对端就是正确程序,也不证明数据库认证和进游戏成功。旧系统没有这些 PowerShell 命令时,可用 netstat -ano 检查监听,并用其他 TCP 连通性工具从玩家电脑测端口。
分别查看结果中的 '''TcpTestSucceeded''':True 表示这个端口可以连接,False 表示连接没有成功。14400 为 True、14401 为 False 时,应先处理游戏端口,而不是继续改客户端的登录端口。
 
两个 True 只证明网络端口能连接,还要实际登录、选角、进入场景;不能据此断定账号或数据库都正常。旧系统没有这些 PowerShell 命令时,可用 netstat -ano 检查服务器监听,并用其他 TCP 连通性工具从玩家电脑测端口。


=== 3. 从真正的外网测试 ===
=== 3. 从真正的外网测试 ===
第308行: 第373行:
|-
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 修改后仍连接旧地址
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 修改后仍连接旧地址
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否启动了另一份客户端/服务端、进程是否重启、更新器是否覆盖了 LoginServer.txt、线路地址是否漏改。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否启动了另一份客户端/服务端、进程是否重启、更新器是否覆盖了 LoginServer.txt、线路地址是否漏改。手工列表可按 [[#用快捷方式直接启动游戏,保留手工设置的 IP|Game.exe -fl 快捷方式说明]] 启动并核对。
|}
|}


第318行: 第383行:
* World、Billing、数据库和管理入口未因这次配置被一并暴露给玩家。
* World、Billing、数据库和管理入口未因这次配置被一并暴露给玩家。
* 如修改后异常,正常停服,恢复备份的服务端配置和各份客户端列表,恢复本次改动的映射/防火墙规则,再按原流程启动。不要回滚未参与本次修改的其他设置。
* 如修改后异常,正常停服,恢复备份的服务端配置和各份客户端列表,恢复本次改动的映射/防火墙规则,再按原流程启动。不要回滚未参与本次修改的其他设置。
== 进阶说明 ==
以下内容用于配置与示例不同,或需要进一步定位问题时查阅。
=== 地址与端口的区别 ===
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 地址或配置项
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 含义
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 代表发起连接的电脑自己。同机服务之间可以用;如果写进朋友的客户端登录地址,指向的会是朋友自己的电脑。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">0.0.0.0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 在系统监听结果中通常表示本机所有 IPv4 接口;不能作为发给玩家的连接地址。它写在线路配置中,也不表示禁用线路。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">IP0 / Port0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | ServerInfo.ini 登录/游戏组中的默认玩家地址和端口。当前程序用 Port0 开始监听连接,默认也把这个端口告诉客户端。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">IP1 / Port1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | ServerInfo.ini 中用于服务端内部配置;不是让内网玩家连接的第二组登录/游戏地址。
|}
当前程序用 IPv4 TCP,在本机所有 IPv4 接口上监听指定端口,源码名称为 INADDR_ANY。因此路由器转发的部署中,IP0 可以是路由器公网 IP,而服务器网卡继续使用内网 IP。本文使用数字 IPv4;域名、IPv6 和不同客户端的处理方式需要另行核对。
=== 同机部署通常保留的内部配置 ===
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 文件内的位置
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 资源文件的示例值
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;World&#93; IP / Port</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 777</code>,连接 World 服务。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Billing&#93; IP0 / Port0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 10101</code>,连接 Billing 服务;此处 IP0 不是玩家游戏地址。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Server0&#93; IP1 / Port1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 8880</code>,保留内部配置。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Server1&#93; IP1 / Port1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 8882</code>,保留内部配置。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">LoginInfo.ini、ShareMemInfo.ini、BillingInfo.ini</code> 的 <code style="white-space:normal;overflow-wrap:anywhere;">&#91;System&#93; DBIP / DBPort</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">127.0.0.1 / 3306</code>,连接数据库;实际已使用其他数据库端口时保留原值。
|}
这些是资源文件的示例,不是让你开放的端口清单。服务配置里“连接到 127.0.0.1”,也不能证明另一个服务只接收本机连接;要看其实际监听与防火墙。World、Billing、数据库和管理端口应限制为需要它们的服务电脑才能访问。
=== 配置编号不同怎么办 ===
{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;"
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 本例配置
! scope="col" style="text-align:left;background:#edf3f2;padding:8px;" | 如何识别
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Server0&#93;</code> 下的 <code style="white-space:normal;overflow-wrap:anywhere;">ServerID=0、Type=0</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Type=0 表示游戏服务。本例 CurrentServerID=0 对应这个服务。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">ServerInfo.ini &#91;Server1&#93;</code> 下的 <code style="white-space:normal;overflow-wrap:anywhere;">ServerID=2、Type=1</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Type=1 表示登录服务。LoginInfo.ini 的 [System] LoginID=2 对应 ServerID=2。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">&#91;Server1&#93;</code> 与 <code style="white-space:normal;overflow-wrap:anywhere;">ServerID=2</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 前者是配置组名称,后者是服务编号;数字不要求相同。不要为了改地址而重编号。
|}
布局与示例不同时,按 Type、ServerID、LoginID 和实际启动配置定位对应服务,再改那一组地址。保留 ServerNumber、MachineID、共享内存键等原值;这些项目不是公网开关。
=== 客户端行格式的补充 ===
LoginServer.txt 用逗号分隔项目。完整区服行的第 1 至 8 项是区组名、区服名、原有属性及提示文字;第 9 至 12 项才是四个登录地址。本文保留前八项,修改已经填写的登录地址。地址为空时,也要保留用于分隔它的逗号。
当前客户端要求至少 12 项;本例第三个地址后的行尾逗号保留第 12 项。若第四个地址已填写,应核对它也能连接 Login;如果还存在第 13 项,它是另一个路由设置,不要把它当 IP 改掉。不要凭“都是数字”就修改区服前半行,也不要把服务端的 ServerID 写进去。
=== 想改用其他端口 ===
端口是 1 至 65535 的整数。同台电脑上的登录、游戏程序应使用不同端口,并避开 World、Billing、数据库和其他程序占用的端口。
例如想把'''游戏端口'''从 14401 改成 24401,需要一起修改 ServerInfo.ini 游戏组的 Port0、Port(CNC)、Port(CTC)、Port(EDU),防火墙放行的游戏端口,以及路由器游戏规则的外部和内部端口。重启后检查新端口是否监听。游戏端口改变不会把客户端 LoginServer.txt 的登录端口变成 24401。
如果改的是'''登录端口''',则修改 ServerInfo.ini 登录组的四个端口、客户端 LoginServer.txt 中所有已填登录地址的端口,以及相应防火墙和转发规则。公网端口与内网端口不同的代理方案需要单独核对,不能直接套用本文同端口的例子。
<span id="线路字段与多机部署"></span>
=== 为什么需要核对运营商地址 ===
资源配置中 LoginInfo.ini 的 [System] ProxyConnect=1。当前实现会根据客户端选择的线路,返回 ServerInfo.ini 中游戏组的 IP(CNC)、IP(CTC)、IP(EDU) 及对应端口;默认分支才使用 IP0/Port0。源码只要成功读取到一对线路 IP/Port 就认为它已启用,即使 IP 填的是 0.0.0.0。
这就是主步骤同时填写四组地址的原因。保留当前可用的 ProxyConnect;它控制代理业务,不是“是否开启公网”的开关。已有专门的代理服务器或多运营商入口时,各组应填写各自真实地址,不能用本文单地址例子覆盖原有部署。
ServerInfo.ini 的 [Proxy] 中 Proxy0ForCncUser、Proxy0ForCtcUser、Proxy0ForEduUser 等,用于识别连接来自哪个代理服务器。它与 [Server0]/[Server1] 下的线路地址用途不同;不要把路由器网关或普通玩家内网 IP 填进去尝试自动区分内外网,当前实现按具体来源 IP 匹配,还会影响代理准入判断。
=== 虚拟机或多台服务器 ===
* 虚拟机桥接:通常让虚拟机成为局域网里的另一台电脑,应在虚拟机中查它自己的 IPv4,并使用那个地址;仍需确认玩家能访问它。
* 虚拟机 NAT:虚拟机通过宿主机转发网络,还需把宿主机收到的登录、游戏端口转给虚拟机。公网再经过家用路由器时,两层转发都要配通,不能只改虚拟机里的游戏配置。
* World、Billing、数据库分散在不同电脑时,相互连接要使用真实可达的内部地址,不能都填代表自己的 127.0.0.1。ShareMemory 等还有同机依赖,拆分到多台电脑不是只改 IP 就能完成。
* 登录与游戏使用不同的公网 IP 时,客户端列表和登录组填登录服务器 IP,游戏组填游戏服务器 IP。
* 同时运行多个游戏程序时,每个承载玩家的程序都要有可达的地址、端口和转发;同机端口不能冲突。还要测试玩家切换到其他游戏服务器上的场景,不能只验证刚进入游戏的位置。
账号注册网站、更新器、管理后台有独立端口需求时,按对应服务另行配置。公网中继、VPN、独立代理及跨服连接的具体效果需要实测。


== 核对依据与适用范围 ==
== 核对依据与适用范围 ==
第352行: 第506行:
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Prj/GameCode/Client/Client/Game/Network/PacketHandler/LCRetCharLoginHandler.cpp</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Prj/GameCode/Client/Client/Game/Network/PacketHandler/LCRetCharLoginHandler.cpp</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 客户端使用服务器下发的 GameServer 地址和端口。
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 客户端使用服务器下发的 GameServer 地址和端口。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Prj/GameCode/Client/Client/Game/Game.cpp</code>;<code style="white-space:normal;overflow-wrap:anywhere;">Prj/GameCode/Client/Client/Game/Procedure/GamePro_Login.h</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Game.exe 的 -fl 启动参数检查,以及相对于运行目录读取 Patch/LoginServer.txt 的路径。
|-
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Prj/GameCode/Client/Client/Launch/PatchSystem.cpp</code>、<code style="white-space:normal;overflow-wrap:anywhere;">Downloader.cpp</code>、<code style="white-space:normal;overflow-wrap:anywhere;">LaunchDialog.cpp</code>
| style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 登录器下载并重写区服列表的条件,以及启动 Game.exe 时传入 -fl 并设置其所在目录为工作目录。
|}
|}
</div>
</div>

2026年9月9日 (三) 17:33的最新版本

首页 · 服务端接口

这篇说明适合已经能在服务器本机正常玩游戏,现在想让同一路由器下的朋友,或互联网上的朋友连接进来的人。操作使用文本编辑器和系统网络设置,不需要安装环境管理工具。

本文以所有服务端程序和数据库都在同一台 Windows 电脑上为例,使用一个登录程序和一个游戏程序。先完成局域网设置,确认另一台电脑能玩,再做公网设置。配置格式不同、服务分散在多台电脑上的情况,见后面的进阶说明。

配置清单 · 局域网 · 公网 · 内外网同时访问 · 验证与排查

先看要改哪些配置

主要修改两份不同的文件。一份在服务器电脑上,另一份在每位玩家的游戏客户端里。

文件在哪里 这份文件负责什么
服务器电脑tlbb/Server/Config/ServerInfo.ini 告诉客户端应该连接哪些登录、游戏地址。IP0、IP(CNC)、IP(CTC)、IP(EDU) 及对应 Port 都在这份文件里修改。
玩家电脑Client/Patch/LoginServer.txt 客户端显示区服列表并发起登录时读取它。里面是一行一行的区服记录,填写“IP:登录端口”,没有 [Server0] 或 IP(CNC)= 这样的配置。

如果你在服务器电脑上也启动客户端测试,两个文件虽然在同一台电脑上,仍然需要分别修改。给朋友的客户端也要带上改好的 LoginServer.txt;只修改服务器电脑上自己的客户端,朋友那一份不会自动更新。

为什么要分别改两份文件

  1. 玩家选择区服,客户端从 LoginServer.txt 读取登录地址,例如 192.168.50.10:14400,连接登录程序 Login。
  2. 玩家选择角色,Login 根据 ServerInfo.ini 告诉客户端游戏地址,例如 192.168.50.10:14401
  3. 客户端再连接游戏程序 Server,进入场景。

所以“能登录账号”和“能进入游戏”是两次不同的连接。只改 LoginServer.txt,可能能看到角色,却在进入场景时连接失败。

这里的 IP 是要连接的电脑地址,端口 用来区分这台电脑上的不同服务。例如 192.168.50.10:14400 中,冒号前是 IP,冒号后是端口。本例 14400 用于登录,14401 用于游戏;客户端 LoginServer.txt 中的地址全部使用登录端口 14400。

修改前的准备

  1. 先确认在服务器本机能正常登录并进入场景。如果本机也不能玩,先处理原有启动或账号问题。
  2. 用平时的正常停服方式关闭服务端,等角色数据保存、ShareMemory 完成保存后再操作;同时关闭客户端。不要直接在任务管理器中强行结束保存程序。
  3. 各复制一份 ServerInfo.ini 和 LoginServer.txt 作为备份。编辑时保留原有文本编码;编辑器若显示 GBK 或 GB18030,保存时继续使用原编码。
  4. 找准实际运行的文件:服务端打开 Server.exe、Login.exe 所使用的 Config 文件夹;客户端打开你实际启动的那份游戏的 Patch 文件夹。不要只改源码目录 resources 里的样本文件。

下面的配置片段都用于修改原文件中的对应项目,不能拿它们覆盖整个文件。文件里的其他配置继续保留。

局域网设置

局域网例子:服务器和朋友的电脑接在同一个家庭路由器下。先在服务器电脑按 Win+R,输入 cmd 并回车,再输入:

ipconfig

找到当前联网的“以太网”或“无线局域网”适配器,记下它的 IPv4 地址。假设查到的是 192.168.50.10,下文就用这个地址演示;如果你查到 192.168.1.20,应把示例里的 192.168.50.10 全部换成 192.168.1.20。

不要抄“默认网关”,那通常是路由器的地址;也不要填朋友电脑的 IP。若服务端在虚拟机里,需在虚拟机里查询,并先看 虚拟机说明

第一步:在服务器电脑修改 ServerInfo.ini

打开 tlbb/Server/Config/ServerInfo.ini。用编辑器查找 [Server0][Server1]:这种用方括号括住的名称表示一组配置,也叫“节”。从这个名称往下,到下一个方括号名称之前,都属于这一组。

本例 [Server0] 中有 Type=0、ServerID=0,是游戏服务;[Server1] 中有 Type=1、ServerID=2,是登录服务。如果你的文件不是这种对应关系,先看 配置编号说明,不要按序号猜。已有的 Type、ServerID 等行都保留原值。

A. 同一个 ServerInfo.ini 文件里的 [Server0]:游戏地址

在原有 [Server0] 下面,把以下 IP 项改为服务器的局域网 IP;这里的四个端口都使用 游戏端口 14401

[Server0]
IP0=192.168.50.10
Port0=14401
IP(CNC)=192.168.50.10
Port(CNC)=14401
IP(CTC)=192.168.50.10
Port(CTC)=14401
IP(EDU)=192.168.50.10
Port(EDU)=14401

B. 仍在 ServerInfo.ini 文件里的 [Server1]:登录地址

继续找到原有 [Server1],把以下 IP 项改为同一个局域网 IP;这一组的四个端口都使用 登录端口 14400

[Server1]
IP0=192.168.50.10
Port0=14400
IP(CNC)=192.168.50.10
Port(CNC)=14400
IP(CTC)=192.168.50.10
Port(CTC)=14400
IP(EDU)=192.168.50.10
Port(EDU)=14400

两个片段之间原来还有其他配置,全部保留;不要重复添加 [Server0] 或 [Server1]。本文假设登录和游戏都在同一台电脑,并且没有另设代理服务器,所以两组 IP 相同,端口不同。

IP(CNC)、IP(CTC)、IP(EDU) 到底是什么

这些都是服务端 ServerInfo.ini 的项目,不写进客户端 LoginServer.txt。它们用于玩家选择不同运营商线路时返回相应地址,分别与 Port(CNC)、Port(CTC)、Port(EDU) 配对;IP0 与 Port0 则是默认地址和端口。

如果你的服务器只有一个可供朋友连接的地址,四个 IP 项都写这个地址即可。[Server0] 的四个 Port 项写 14401,[Server1] 的四个 Port 项写 14400。这样无论选择哪条线路,都能得到同一台服务器的正确端口。不要把 IP(CNC) 理解成公网 IP、IP(CTC) 理解成内网 IP。

这些线路项目若还留着旧 IP 或 0.0.0.0,可能在切换线路后连接失败;源码中 0.0.0.0 不代表关闭线路。原因放在后文的进阶说明中。

哪些 IP 这次先不改

所有服务端程序和数据库都在同一台电脑时,保留原有 IP1、Port1、[World]、[Billing] 和数据库 DBIP/DBPort。它们主要用于服务程序之间的通信。尤其不要使用“全部替换”,把文件中所有 127.0.0.1 都改掉。

改完后核对:游戏组是你的 IP 加 14401,登录组是你的 IP 加 14400;这一步只改了 ServerInfo.ini,还没有修改客户端。

第二步:在玩家电脑修改 LoginServer.txt

关闭游戏,用编辑器打开 Client/Patch/LoginServer.txt。这是另一份文件,里面按行列出区服名称和登录地址。

在 SERVER_BEGIN 与 SERVER_END 之间找到你要进入的区服,例如“天下第一”。保留这行前面的区组名、区服名、数字和提示文字,只改后面的地址。原来三个 127.0.0.1:14400,都改为 192.168.50.10:14400

以下是本例修改后的完整一行;如果你的前半行内容不同,保留你自己的前半行:

华东电信一区,天下第一,0,101,3,0,0,WELECOME TO TLBB,192.168.50.10:14400,192.168.50.10:14400,192.168.50.10:14400,

一条区服记录在文件中必须保持一行。网页显示时可能自动折行,保存时不要在中间按回车。使用英文半角逗号和冒号,地址两边不要加引号或空格。

“三个地址和空的第四地址”是什么意思

看这行末尾的地址部分:

192.168.50.10:14400,192.168.50.10:14400,192.168.50.10:14400,
  • 第一个地址:192.168.50.10:14400。
  • 第二个地址:192.168.50.10:14400。
  • 第三个地址:192.168.50.10:14400。
  • 第四个地址:本例没有填写,第三个地址后面的最后一个逗号要保留

这几个位置都是登录地址,供客户端选择线路时使用,不是分别填写“登录、游戏、公网、内网”。单个服务器地址的例子,三个位置都填一样即可;不要把其中一个改成游戏端口 14401。

逗号用于分隔项目。行尾逗号表示还有一个空项目,当前客户端依靠它读到足够的项目数量;删掉这个逗号,本例区服可能直接不显示。原文件若已经填了第四个地址,也将它改为有效的登录地址;原有额外数字或路由设置先保留,见 行格式说明

保存后把改好的文件放进每位玩家实际启动的那份客户端的 Patch 文件夹,再重新启动客户端。其他区服记录保持原样。

用快捷方式直接启动游戏,保留手工设置的 IP

如果你还没有把 Launch.ini 中的更新地址、区服列表地址配置成自己的,手工改好 LoginServer.txt 后,可以用 Game.exe -fl 的快捷方式直接启动游戏。这种启动方式不需要先配置 Launch.ini。

原因是:Launch.exe 是登录器和更新程序;Game.exe 才是游戏本体。Launch 的更新流程会根据 Launch.ini 的 [Launch] LoginServer 地址下载列表,写入 Client/Patch/loginserver.txt。在通常的 Windows 文件系统上,它与 LoginServer.txt 是同一份文件,手工填写的 IP 就可能被下载内容覆盖。

要避开的是 Launch 的更新流程。直接启动 Game.exe 不经过这段流程;-fl 是游戏识别“从登录器启动”的参数,Launch 自己启动游戏时也会带上它。它不是把 LoginServer.txt 设为只读的开关,再运行登录器或其他更新工具,文件仍可能被覆盖。

玩家电脑按下面操作:

  1. 关闭游戏和已经打开的 Launch 登录器,先备份并确认 Client/Patch/LoginServer.txt 中是自己设置的 IP。
  2. 找到实际使用的 Game.exe。常见 32 位程序位于 Client/Bin/Game.exe,64 位程序位于 Client/Bin64/Game.exe;选择已经能在这台电脑上正常运行的那一份,不需要同时建两个快捷方式。
  3. 右键 Game.exe,选择“发送到 → 桌面快捷方式”;Windows 11 可能需要先点“显示更多选项”。
  4. 右键桌面上的快捷方式,打开“属性”,切换到“快捷方式”选项卡。
  5. 在“目标”中保留 Game.exe 的完整路径,在路径结束的引号外面加一个空格,再加 -fl。使用英文半角连字符、小写 f 和小写字母 l,最后不是数字 1。
  6. 将“起始位置”设为这个 Game.exe 所在的文件夹,点击“应用”“确定”。以后用这个快捷方式启动游戏。

例如,你的客户端放在 D:\Games\TLBB\Client,使用 Bin 下的 Game.exe,快捷方式“目标”填写:

"D:\Games\TLBB\Client\Bin\Game.exe" -fl

同一个快捷方式的“起始位置”填写:

"D:\Games\TLBB\Client\Bin"

上面是快捷方式属性里的两个输入框,不是让你把两行都写到配置文件,也不是文件名。路径要换成自己电脑上的实际路径;不要把参数写成 "Game.exe -fl",不要把 Game.exe 重命名。

使用 Bin64 的 Game.exe 时,将“目标”改为对应的 Bin64/Game.exe,并将“起始位置”同步改为 Bin64 文件夹。程序依赖相对路径找资源,例如从 Bin 或 Bin64 读取上一级 Patch/LoginServer.txt,所以“起始位置”不能随意填桌面或 Client 根目录。

第一次用快捷方式启动后,核对区服列表和实际连接;退出游戏,再用编辑器查看同一份 LoginServer.txt,确认 IP 没有被覆盖。如果仍提示“请从 Launch.exe 运行游戏”,先核对参数是否在引号外、是否确为 -fl,以及快捷方式是否指向正确的 Game.exe。

直启会跳过本次登录器的更新、修复和客户端位数选择流程。前提是游戏资源及运行环境已齐全、客户端与服务端匹配;-fl 不能补齐缺少的文件,也不能修复网络不通。以后需要运行 Launch 更新时,先备份自己的列表并核对更新来源,更新后再检查 IP。不同来源或不同编译配置的 Game.exe 对参数检查可能不同,实际启动及文件保留效果需要实测

第三步:在服务器电脑允许两个端口通过防火墙

这一步让别的电脑能访问登录和游戏程序。在服务器电脑上按 Win+R,输入 wf.msc 并回车,打开“高级安全 Windows 防火墙”:

  1. 点击“入站规则”,再点“新建规则”。
  2. 规则类型选择“端口”。
  3. 选择“TCP”,在“特定本地端口”中填写 14400,14401
  4. 选择“允许连接”。
  5. 勾选服务器当前联网连接使用的配置文件。Windows 网络属性显示“专用”就需勾选“专用”,显示“公用”就需勾选“公用”;不确定时先在系统网络设置中确认。
  6. 给规则起名,例如“TLBB 登录与游戏”,保存规则。

纯局域网使用时,可在规则属性的“作用域”中将远程 IP 限制为实际玩家地址或网段。后来开放公网时,也要重新确认这个范围允许外网玩家;云服务器还要设置后文的云安全组。不要为了测试而关闭整个防火墙。

如果仍然不通,检查玩家是否连到访客 Wi-Fi,路由器是否启用了“客户端隔离”;这些功能可能不允许两台电脑互相连接。

第四步:启动服务,用另一台电脑进游戏

按平时手工开服的流程启动。依赖顺序为:数据库就绪,再依次启动 ShareMemory、Billing、World、Login、Server;每一步确认正常后再继续。这次只改网络地址,原有启动参数保持不变。

从同一路由器下的另一台玩家电脑打开改好的客户端,选择目标区服,登录账号、选择角色并进入场景。能进入并正常移动,才算完成局域网这一步;只在服务器本机测试不足以证明朋友也能连。失败时按 验证与排查 检查,不要急着继续改公网。

公网设置

公网就是让不在你家局域网里的朋友,通过互联网连接进来。家用路由器部署通常需要两个地址:服务器的内网 IP宽带的公网 IP

本例地址 填在什么地方
192.168.50.10:服务器内网 IP 服务器网卡继续使用它;路由器把收到的连接转发到这个地址。
203.0.113.10:假设的公网 IP 服务端向玩家提供的地址、玩家客户端的登录地址改为它。此地址仅供文档举例,必须换成自己的真实公网 IP。

第一步:确认你有能接收连接的公网 IP

家用路由器:进入路由器管理页面,查看“上网设置”或“WAN 状态”的 IPv4 地址。WAN 指路由器连接宽带的那一侧。向运营商确认这条宽带是否分配了可接收入站连接的公网 IPv4;网页上查到一个出口 IP,不能证明你能在这个 IP 上开放游戏端口。

如果 WAN 地址落在以下范围,它仍是内部地址,不能直接填给外网朋友使用:

  • 10.0.0.0 到 10.255.255.255。
  • 172.16.0.0 到 172.31.255.255。
  • 192.168.0.0 到 192.168.255.255。
  • 100.64.0.0 到 100.127.255.255。

这可能是光猫还在做一层转发,也可能是运营商没有给你独立公网地址。没有可控制的公网入口时,单改游戏配置无法解决,需要先处理宽带地址,或另行配置公网转发/VPN;具体网络效果需要实测。

云服务器:在云控制台找到这台实例的“公网 IP”或“弹性公网 IP(EIP)”,使用它作为玩家连接地址。后面的路由器操作改为云控制台的“安全组”设置。

第二步:在服务器电脑把 ServerInfo.ini 改为公网地址

先正常停服。仍然打开 tlbb/Server/Config/ServerInfo.ini,这次把之前写的局域网 IP 改成真实公网 IP。下面依旧使用 203.0.113.10 作示例,端口保持 14400/14401。

A. ServerInfo.ini 的 [Server0]:公网游戏地址

[Server0]
IP0=203.0.113.10
Port0=14401
IP(CNC)=203.0.113.10
Port(CNC)=14401
IP(CTC)=203.0.113.10
Port(CTC)=14401
IP(EDU)=203.0.113.10
Port(EDU)=14401

B. ServerInfo.ini 的 [Server1]:公网登录地址

[Server1]
IP0=203.0.113.10
Port0=14400
IP(CNC)=203.0.113.10
Port(CNC)=14400
IP(CTC)=203.0.113.10
Port(CTC)=14400
IP(EDU)=203.0.113.10
Port(EDU)=14400

只替换原有组里的这些项目,保留其他行。服务器网卡仍使用原来的内网 IP;同机内部的 IP1、World、Billing、数据库地址也保持原配置。不要把路由器的公网 IP 填到服务器的网卡设置里。

第三步:把玩家的 LoginServer.txt 改为公网登录地址

关闭客户端,打开 Client/Patch/LoginServer.txt,找到同一个目标区服,把已填写的登录地址改成 真实公网 IP:14400。本例修改后的完整一行是:

华东电信一区,天下第一,0,101,3,0,0,WELECOME TO TLBB,203.0.113.10:14400,203.0.113.10:14400,203.0.113.10:14400,

同样保留最后的逗号,所有已填地址都用登录端口 14400,并把文件同步给朋友。没有配置自己的 Launch 更新来源时,按 Game.exe -fl 快捷方式说明 启动,避免列表又被下载覆盖。到这一步,两份文件里的玩家连接地址已经改为公网,下面还要让路由器把连接送到服务器。

第四步:在路由器添加两条端口转发

路由器管理页面找到“端口转发”,也可能叫“虚拟服务器”或“NAT 转发”。它的作用是:朋友访问你的公网 IP 时,路由器知道应转交给内网的哪台电脑。

新建登录游戏两条规则,按下面填写。目标 IP 使用服务器的内网 IP,不是公网 IP,也不是路由器自己的地址。

路由器界面中的项目 应该填写什么
规则名称 第一条叫“TLBB 登录”;第二条叫“TLBB 游戏”,名称便于自己识别。
协议 两条均选择 TCP。
内部 IP / 目标 IP / 服务器 IP 两条均填服务器内网 IP,本例 192.168.50.10。
外部端口 / 公共端口 登录规则填 14400,游戏规则填 14401。
内部端口 / 本地端口 登录规则同样填 14400,游戏规则同样填 14401。
启用状态 两条都启用并保存。

如果界面要求填写“起始端口”和“结束端口”,一条规则的起止端口填同一个数。例如登录规则两格都填 14400。完成后的连接关系应当是:

  • 朋友访问 公网 IP:14400,转到 192.168.50.10:14400
  • 朋友访问 公网 IP:14401,转到 192.168.50.10:14401

在路由器的地址分配设置中,为服务器保留固定内网 IP,避免重启后地址变化、规则却还指向旧电脑。这通常叫“DHCP 地址保留”或“静态地址分配”。不要为同一个服务器 IP 随意占用其他设备已使用的地址。

两条规则的外部和内部端口先保持相同。不要只把外部游戏端口改为 24401、内部仍用 14401;服务端如果还告诉客户端去连接 14401,客户端就找不到你设置的外部入口。确实需要换端口时,见 改端口说明

光猫和路由器都在做地址转发时,光猫还要把这两个端口转给路由器,路由器再转给服务器;只配置其中一层可能不通。不同设备的管理页面不同,要按真实网络连接核对。

云服务器的对应操作

在云控制台找到绑定到这台服务器的安全组,也就是云平台提供的一层网络防火墙,添加允许入站 TCP 14400 和 TCP 14401 的规则;来源范围应包含预期玩家的公网地址。服务器 Windows 防火墙也要允许这两个端口。若局域网步骤中限制了来源为内网地址,公网使用时需调整。

云平台已经把公网 IP 绑定到实例时,按该平台要求检查公网绑定或转发,无需套用家用路由器界面。公网 IP 直接配在服务器网卡、没有路由器转发的部署,也只需检查实际路径上的防火墙等规则。

本篇游戏连接使用 TCP。World、Billing、数据库和远程管理端口不属于玩家所需的这两个端口,不随这次操作一起开放。

第五步:从真正的外网测试

重新启动服务端,让一位不在你家 Wi-Fi 下的朋友测试,或用连接手机热点的电脑测试:选择区服、登录、选角、进入场景并移动。两台电脑仍在同一路由器下时,不能用这个结果证明真正外网可用。

外网不能进时,按 验证与排查 分别测试 14400 与 14401。如果朋友在外面能玩、你自己在家反而进不去,继续看下一节。

公网和局域网同时访问

假设外面的朋友已经能用公网 IP 玩游戏,你自己在家也使用这份客户端。此时你的电脑是从局域网访问自家的公网 IP,再回到局域网服务器。路由器需要支持这种“出去再转回来”的连接,通常叫 NAT 回环,英文名称为 NAT loopback 或 hairpin NAT。

如果路由器支持并启用它,服务端和所有客户端可以统一使用公网地址,再从家里的玩家电脑完成一次登录、进场景测试。如果不支持,可能出现“朋友能玩,我自己进不去”;这不一定是服务器配置错了。

只给自己把 LoginServer.txt 改回内网 IP,不保证能解决。这只改变最初的登录地址,选择角色后服务器仍会告诉客户端连接公网游戏地址。ServerInfo.ini 的 IP1 也不会自动成为给内网玩家返回的地址。

方案 设置与前提
同一个公网入口,路由器支持 NAT 回环 服务端和客户端统一使用公网示例。路由器必须支持并启用 NAT loopback / hairpin NAT,让局域网玩家访问公网登录、游戏端口时正确转回内网。必须用一台局域网客户端实测两个端口及完整进游戏。
所有玩家通过 VPN 组网 VPN 可让不同地点的电脑加入一个虚拟内部网络。所有玩家和服务器都加入并能互相连接后,可按局域网步骤使用服务器的 VPN IPv4。没有加入的普通公网玩家不能直接使用这个地址,实际组网效果需要实测。
路由器不支持回环,且希望维持普通公网入口 需要调整路由/更换支持回环的设备,或专门设计能正确返回内外地址的代理方案。不能承诺只修改本文几个 IP 就同时连通。

在服务器本机测试公网 IP 也可能遇到 NAT 回环限制。先分别用局域网另一台电脑与真正的外网电脑测试,避免把“内网访问自己的公网地址失败”误判为公网服务不可达。

只修改 hosts、做域名内外分流,不能修正本文服务端直接下发的数字 IP;不同来源返回不同地址的代理方案需要同时核对登录、进入场景以及后续换服连接,需要实测。

验证与排查

1. 服务器上检查监听

“监听”表示程序已经启动,并在等待其他电脑连接。在服务器电脑上从开始菜单搜索并打开 PowerShell,输入以下命令;命令中的 14400、14401 要与实际设置一致:

Get-NetTCPConnection -State Listen -LocalPort 14400,14401 |
    Select-Object LocalAddress,LocalPort,OwningProcess

结果应有 14400 和 14401 两个端口。LocalPort 是本地端口,OwningProcess 是占用它的程序编号(PID);LocalAddress 显示 0.0.0.0 通常表示正在本机所有 IPv4 网络接口上等待连接,属于正常情况。

要确认是否由正确程序占用,将下一条命令中的 1234 换成对应行的 OwningProcess 数字,再执行:

Get-Process -Id 1234 | Select-Object Id,ProcessName,Path

登录端口对应 Login,游戏端口对应 Server;有些部署的程序名使用 LoginServer、GameServer。查询无记录、报未找到对象或只有一个端口时,先查该服务是否启动成功、实际读取哪个 Config 文件夹,以及是否被别的程序占用了端口。

2. 从局域网玩家电脑测试

这次到另一台玩家电脑打开 PowerShell,输入以下两条命令。将 192.168.50.10 换成服务器的实际内网 IP:

Test-NetConnection -ComputerName 192.168.50.10 -Port 14400
Test-NetConnection -ComputerName 192.168.50.10 -Port 14401

分别查看结果中的 TcpTestSucceeded:True 表示这个端口可以连接,False 表示连接没有成功。14400 为 True、14401 为 False 时,应先处理游戏端口,而不是继续改客户端的登录端口。

两个 True 只证明网络端口能连接,还要实际登录、选角、进入场景;不能据此断定账号或数据库都正常。旧系统没有这些 PowerShell 命令时,可用 netstat -ano 检查服务器监听,并用其他 TCP 连通性工具从玩家电脑测端口。

3. 从真正的外网测试

使用未连接服务器局域网的另一台电脑,例如手机热点下的电脑;将下列文档 IP 换成实际公网 IP:

Test-NetConnection -ComputerName 203.0.113.10 -Port 14400
Test-NetConnection -ComputerName 203.0.113.10 -Port 14401

两项都成功后,再用对应客户端实际选择区服、登录账号、选择角色并进入场景,确认能够移动;有多游戏进程时还要测试相应换场景连接。需要内外网同时使用时,在局域网客户端重复完整流程。能 ping 通不代表 TCP 端口开放,ping 不通也不代表 TCP 一定不通。

按失败阶段定位

现象 优先核对
目标区服不显示或显示异常 实际读取的 LoginServer.txt、文件编码、SERVER_BEGIN/END、目标记录是否同一行、字段数量和行尾逗号;本机改的文件是否同步给玩家。
14400/14401 在服务器上没有监听 Login/Server 是否正常启动;是否改了资源副本而非部署文件;端口冲突、World/数据库等依赖错误。
本机可测通,局域网电脑测不通 服务器实际内网 IP、主机防火墙配置文件与来源范围、访客 Wi-Fi 隔离、虚拟机网络模式和路由。
局域网通,真正外网两个端口不通 公网入口是否可控、双重 NAT/运营商 NAT、两个 TCP 转发、映射内网 IP、云安全组及上游入站限制。
能登录或看到角色,进入游戏失败 GameServer 返回的 IP/端口、14401 映射与监听;所有被选中的 IP(CNC/CTC/EDU) 是否还指向旧地址;Login 与游戏配置是否同步。
只在切换线路后失败 客户端备用登录地址及第四地址、服务器对应线路的 IP/Port、ProxyConnect 与代理来源识别配置。
外网可玩,内网使用公网入口失败 路由器 NAT 回环,以及登录成功后返回的游戏地址。
端口都通但认证或进场景仍失败 账号、Billing/数据库、World 与游戏进程就绪情况、客户端和服务端资源是否匹配;结合日志定位,不能仅凭 TCP 成功排除业务故障。
修改后仍连接旧地址 是否启动了另一份客户端/服务端、进程是否重启、更新器是否覆盖了 LoginServer.txt、线路地址是否漏改。手工列表可按 Game.exe -fl 快捷方式说明 启动并核对。

Login 日志中的 WLRetCharLoginHandler::Execute() 成功记录包含下发的 IP、Port、SID,可用于核对进入游戏时真正使用的地址。若它下发的地址本身不可达,继续修改客户端初始登录地址不会修复这一段。

验收与恢复

  • 监听进程正确;局域网或公网目标玩家能访问两个实际 TCP 端口。
  • 同一份已更新客户端能够登录、选角、进场景;需要同时支持的网络和线路分别完成实测。
  • World、Billing、数据库和管理入口未因这次配置被一并暴露给玩家。
  • 如修改后异常,正常停服,恢复备份的服务端配置和各份客户端列表,恢复本次改动的映射/防火墙规则,再按原流程启动。不要回滚未参与本次修改的其他设置。

进阶说明

以下内容用于配置与示例不同,或需要进一步定位问题时查阅。

地址与端口的区别

地址或配置项 含义
127.0.0.1 代表发起连接的电脑自己。同机服务之间可以用;如果写进朋友的客户端登录地址,指向的会是朋友自己的电脑。
0.0.0.0 在系统监听结果中通常表示本机所有 IPv4 接口;不能作为发给玩家的连接地址。它写在线路配置中,也不表示禁用线路。
IP0 / Port0 ServerInfo.ini 登录/游戏组中的默认玩家地址和端口。当前程序用 Port0 开始监听连接,默认也把这个端口告诉客户端。
IP1 / Port1 ServerInfo.ini 中用于服务端内部配置;不是让内网玩家连接的第二组登录/游戏地址。

当前程序用 IPv4 TCP,在本机所有 IPv4 接口上监听指定端口,源码名称为 INADDR_ANY。因此路由器转发的部署中,IP0 可以是路由器公网 IP,而服务器网卡继续使用内网 IP。本文使用数字 IPv4;域名、IPv6 和不同客户端的处理方式需要另行核对。

同机部署通常保留的内部配置

文件内的位置 资源文件的示例值
ServerInfo.ini [World] IP / Port 127.0.0.1 / 777,连接 World 服务。
ServerInfo.ini [Billing] IP0 / Port0 127.0.0.1 / 10101,连接 Billing 服务;此处 IP0 不是玩家游戏地址。
ServerInfo.ini [Server0] IP1 / Port1 127.0.0.1 / 8880,保留内部配置。
ServerInfo.ini [Server1] IP1 / Port1 127.0.0.1 / 8882,保留内部配置。
LoginInfo.ini、ShareMemInfo.ini、BillingInfo.ini[System] DBIP / DBPort 127.0.0.1 / 3306,连接数据库;实际已使用其他数据库端口时保留原值。

这些是资源文件的示例,不是让你开放的端口清单。服务配置里“连接到 127.0.0.1”,也不能证明另一个服务只接收本机连接;要看其实际监听与防火墙。World、Billing、数据库和管理端口应限制为需要它们的服务电脑才能访问。

配置编号不同怎么办

本例配置 如何识别
ServerInfo.ini [Server0] 下的 ServerID=0、Type=0 Type=0 表示游戏服务。本例 CurrentServerID=0 对应这个服务。
ServerInfo.ini [Server1] 下的 ServerID=2、Type=1 Type=1 表示登录服务。LoginInfo.ini 的 [System] LoginID=2 对应 ServerID=2。
[Server1]ServerID=2 前者是配置组名称,后者是服务编号;数字不要求相同。不要为了改地址而重编号。

布局与示例不同时,按 Type、ServerID、LoginID 和实际启动配置定位对应服务,再改那一组地址。保留 ServerNumber、MachineID、共享内存键等原值;这些项目不是公网开关。

客户端行格式的补充

LoginServer.txt 用逗号分隔项目。完整区服行的第 1 至 8 项是区组名、区服名、原有属性及提示文字;第 9 至 12 项才是四个登录地址。本文保留前八项,修改已经填写的登录地址。地址为空时,也要保留用于分隔它的逗号。

当前客户端要求至少 12 项;本例第三个地址后的行尾逗号保留第 12 项。若第四个地址已填写,应核对它也能连接 Login;如果还存在第 13 项,它是另一个路由设置,不要把它当 IP 改掉。不要凭“都是数字”就修改区服前半行,也不要把服务端的 ServerID 写进去。

想改用其他端口

端口是 1 至 65535 的整数。同台电脑上的登录、游戏程序应使用不同端口,并避开 World、Billing、数据库和其他程序占用的端口。

例如想把游戏端口从 14401 改成 24401,需要一起修改 ServerInfo.ini 游戏组的 Port0、Port(CNC)、Port(CTC)、Port(EDU),防火墙放行的游戏端口,以及路由器游戏规则的外部和内部端口。重启后检查新端口是否监听。游戏端口改变不会把客户端 LoginServer.txt 的登录端口变成 24401。

如果改的是登录端口,则修改 ServerInfo.ini 登录组的四个端口、客户端 LoginServer.txt 中所有已填登录地址的端口,以及相应防火墙和转发规则。公网端口与内网端口不同的代理方案需要单独核对,不能直接套用本文同端口的例子。

为什么需要核对运营商地址

资源配置中 LoginInfo.ini 的 [System] ProxyConnect=1。当前实现会根据客户端选择的线路,返回 ServerInfo.ini 中游戏组的 IP(CNC)、IP(CTC)、IP(EDU) 及对应端口;默认分支才使用 IP0/Port0。源码只要成功读取到一对线路 IP/Port 就认为它已启用,即使 IP 填的是 0.0.0.0。

这就是主步骤同时填写四组地址的原因。保留当前可用的 ProxyConnect;它控制代理业务,不是“是否开启公网”的开关。已有专门的代理服务器或多运营商入口时,各组应填写各自真实地址,不能用本文单地址例子覆盖原有部署。

ServerInfo.ini 的 [Proxy] 中 Proxy0ForCncUser、Proxy0ForCtcUser、Proxy0ForEduUser 等,用于识别连接来自哪个代理服务器。它与 [Server0]/[Server1] 下的线路地址用途不同;不要把路由器网关或普通玩家内网 IP 填进去尝试自动区分内外网,当前实现按具体来源 IP 匹配,还会影响代理准入判断。

虚拟机或多台服务器

  • 虚拟机桥接:通常让虚拟机成为局域网里的另一台电脑,应在虚拟机中查它自己的 IPv4,并使用那个地址;仍需确认玩家能访问它。
  • 虚拟机 NAT:虚拟机通过宿主机转发网络,还需把宿主机收到的登录、游戏端口转给虚拟机。公网再经过家用路由器时,两层转发都要配通,不能只改虚拟机里的游戏配置。
  • World、Billing、数据库分散在不同电脑时,相互连接要使用真实可达的内部地址,不能都填代表自己的 127.0.0.1。ShareMemory 等还有同机依赖,拆分到多台电脑不是只改 IP 就能完成。
  • 登录与游戏使用不同的公网 IP 时,客户端列表和登录组填登录服务器 IP,游戏组填游戏服务器 IP。
  • 同时运行多个游戏程序时,每个承载玩家的程序都要有可达的地址、端口和转发;同机端口不能冲突。还要测试玩家切换到其他游戏服务器上的场景,不能只验证刚进入游戏的位置。

账号注册网站、更新器、管理后台有独立端口需求时,按对应服务另行配置。公网中继、VPN、独立代理及跨服连接的具体效果需要实测。

核对依据与适用范围

字段及调用路径已对照当前源码和资源配置核对;本文示例没有在真实公网、路由器或游戏进程中执行,完整连接效果需要实测。同名配置在其他实现中可能有不同含义,应先确认实际运行程序与配置布局一致。

源码或资源位置(相对项目目录) 用于核对
resources/Server/Config/ServerInfo.iniLoginInfo.ini 示例节名、ServerID、LoginID、端口及 ProxyConnect。
resources/Client/Patch/LoginServer.txt 目标区服记录与行尾空地址字段。
Prj/GameCode/Server/Tools/TlbbEnvironmentManager/TlbbEnvironmentManager.Core/PathsAndConfig.cs 外网设置修改的服务端键与客户端三个已填地址;仅作为参考来源,文章操作不依赖此工具。
Prj/GameCode/Common/ServerBase/Config.cppConfig.h 线路字段启用条件、服务 ID 映射与代理来源识别。
Prj/GameCode/Common/Net/Socket.cppServerSocket.cpp IPv4 TCP、INADDR_ANY 监听。
Prj/GameCode/Server/Server/LoginServer/Login/Player/LoginPlayerManager.cppGameServer/Server/Player/IncomingPlayerManager.cpp Login 与 GameServer 从 Port0 建立玩家端监听。后一个路径相对同级 Server/Server。
Prj/GameCode/Server/Server/LoginServer/Login/Packets/WLRetCharLoginHandler.cpp;同一 Login 目录的 Player/LoginPlayer.cpp 进入游戏时下发游戏地址、线路选择及默认回退。
Prj/GameCode/Client/Client/Game/Procedure/GamePro_Login.cppLoginDataStructDef.h 区服行解析、四个登录地址与线路选择。
Prj/GameCode/Client/Client/Game/Network/PacketHandler/LCRetCharLoginHandler.cpp 客户端使用服务器下发的 GameServer 地址和端口。
Prj/GameCode/Client/Client/Game/Game.cppPrj/GameCode/Client/Client/Game/Procedure/GamePro_Login.h Game.exe 的 -fl 启动参数检查,以及相对于运行目录读取 Patch/LoginServer.txt 的路径。
Prj/GameCode/Client/Client/Launch/PatchSystem.cppDownloader.cppLaunchDialog.cpp 登录器下载并重写区服列表的条件,以及启动 Game.exe 时传入 -fl 并设置其所在目录为工作目录。