Battle.net 大厅前缺少 1.13c SID_NULL 保活,闲置后连接可能被静默关闭 #541
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象 / 风险
客户端登录 Battle.net 后,如果停在大厅前的界面(选人、建人、游戏列表、频道聊天)一段时间不操作,BNCS 连接(以及可能的 MCP realm 连接)没有任何上行流量。1.13c 原版客户端会定期发送
SID_NULL(BNCS0x00)保活,我们的客户端从来不发。一旦服务器端或 WSS 桥(nginx → bnetd/d2cs)有空闲超时,连接就会被静默关闭。用户下一次操作(比如点创建角色)才会发现已经断线。之前遇到的建人失败("MCP realm session is not connected")可能就有这个原因。
代码现状(main
309738c)src/netproto/bncs/packets.ts:118已经有encodeBncsNull()(0x00,空 payload),但除了测试tests/e2e-netproto/tier5-adversarial-coverage.test.ts:561以外,没有任何地方调用它。src/netproto/bncs/session.ts:140-145只会被动回应服务器发来的SID_PING(0x25),没有任何定时器主动发保活包。SID_NULL时只做了解码(packets.ts:294),没有其他处理。src/netproto/mcp/session.ts)同样没有空闲保活。0x6Dping,不在本 issue 范围内。待确认(不要猜常数)
/usr/local/google/home/taodao/d2-data/Bnclient.dll找到SID_NULL的发送点(构造FF 00 04 00的位置)和驱动它的定时器常数。BNETDocs 记载的是每 8 分钟一次左右,但以 DLL 为准。同时确认在 MCP 连接建立后(选人界面)BNCS 是否还继续发。D2MCPClient.dll/D2Client.dll有没有 MCP 层的周期包。没有就不要发明。proxy_read_timeout(默认 60s)。如果没调过,空闲 60 秒就会被关,这比 bnetd 的超时更可能先触发。这时只靠 1.13c 的 8 分钟间隔是不够的,需要另行评估(例如 WebSocket ping 帧,或在桥上调长超时),并单独记录这是 web 桥带来的偏差,不属于 1.13c 行为。.d2cap。期望修复
SID_NULL;会话关闭时清理定时器,不能泄漏。相关
fix/lobby-disconnect(309738c):掉线统一回到登录页SID_LOGONRESPONSE2在服务器端曾出现短暂超时(与本 issue 无关,另行观察)