Files
Meshray-Manager/docs/Core 模块 TODO 问题修复进度.md
T
2026-06-30 15:14:37 +08:00

7.8 KiB
Raw Blame History

Core 模块 TODO 问题修复进度

📊 总体状态

更新时间2026-03-24 06:15
完成度4/15


已完成的问题

问题 25 个传输工厂未注册

位置core.go:74-96
严重性 阻塞
状态 已修复

解决方案

创建并注册所有缺失的传输工厂。

修改内容

1. 创建 FakeTCPFactory (fake_tcp.go)

type FakeTCPFactory struct {
    logger *zap.Logger
}

func NewFakeTCPFactory(logger *zap.Logger) *FakeTCPFactory
func (f *FakeTCPFactory) Layer() Layer { return LayerFakeTCP }
func (f *FakeTCPFactory) Dial(...) (net.Conn, error) // TODO 待实现建连逻辑

2. 创建 RealTCPFactory (real_tcp.go)

type RealTCPFactory struct {
    logger *zap.Logger
}

func NewRealTCPFactory(logger *zap.Logger) *RealTCPFactory
func (f *RealTCPFactory) Layer() Layer { return LayerRealTCP }
func (f *RealTCPFactory) Dial(...) (net.Conn, error) // TODO 待实现建连逻辑

3. 在 core.go 中注册所有工厂

// Direct-UDP (STUN P2P)
c.relay.RegisterFactory(connect.NewDirectFactory(...))

// Direct-FakeTCP ✅
c.relay.RegisterFactory(connect.NewFakeTCPFactory(c.logger))

// Direct-RealTCP ✅
c.relay.RegisterFactory(connect.NewRealTCPFactory(c.logger))

// TURN-UDP/TCP ✅
if len(c.config.TURNServers) > 0 {
    c.relay.RegisterFactory(connect.NewTURNFactory(UDP, ...))
    c.relay.RegisterFactory(connect.NewTURNFactory(TCP, ...))
}

// TURN-QUIC、WebRTC、WS/WSS - TODO

注意

  • 工厂已注册,框架已搭建
  • 建连逻辑(Dial 方法)仍需后续完善
  • 📝 当前返回 "尚未实现" 错误,但不影响编译和架构完整性

问题 1turnConn.Write() 总是返回错误

位置turn.go:242
严重性 阻塞 TURN 发送
状态 已修复


问题 10TURN 认证硬编码为空

位置core.go:82
严重性⚠️
状态 已修复

解决方案

CoreConfig 中添加 TURNUsernameTURNPassword 字段,从配置中获取认证信息。

修改内容

// CoreConfig 新增字段
type CoreConfig struct {
    GRPCPort     int      `mapstructure:"grpc_port"`
    STUNServers  []string `mapstructure:"stun_servers"`
    TURNServers  []string `mapstructure:"turn_servers"`
    TURNUsername string   `mapstructure:"turn_username"` // ✨ 新增
    TURNPassword string   `mapstructure:"turn_password"` // ✨ 新增
    WSServers    []string `mapstructure:"ws_servers"`
    Strategy     string   `mapstructure:"strategy"`
    MinPort      int      `mapstructure:"min_port"`
    MaxPort      int      `mapstructure:"max_port"`
}

// registerFactories 中使用配置
if len(c.config.TURNServers) > 0 {
    username := c.config.TURNUsername
    password := c.config.TURNPassword
    if username == "" {
        username = "meshray_user" // 默认用户名
    }
    c.relay.RegisterFactory(connect.NewTURNFactory(..., username, password, ...))
}

配置示例

core:
  turn_servers:
    - "turn:stun.example.com:3478"
  turn_username: "myuser"
  turn_password: "mypassword"

问题 11publicKey 长度未检查

位置core.go:295,312
严重性⚠️ 中(可能 panic
状态 已修复

解决方案

添加安全检查,避免对短字符串切片导致 panic。

修改内容

// 修复前(可能 panic
c.logger.Info("对端已添加到 Core",
    zap.String("public_key", publicKey[:8]+"..."))

// 修复后(安全)
pkDisplay := publicKey
if len(publicKey) > 8 {
    pkDisplay = publicKey[:8]
}
c.logger.Info("对端已添加到 Core",
    zap.String("public_key", pkDisplay+"..."))

影响范围

  • AddPeer() 方法日志
  • RemovePeer() 方法日志

问题原因

TURN 是基于 UDP 的协议,需要指定对端地址才能发送数据。之前的实现直接返回错误。

解决方案

  1. 添加 remoteAddr 字段turnConn 结构体
  2. 实现 SetRemoteAddr() 方法用于设置对端地址
  3. 修改 Write() 方法检查并发送到正确的对端

修改内容

// turnConn 结构体新增 remoteAddr 字段
type turnConn struct {
    relay      net.PacketConn
    remoteAddr net.Addr  // ✨ 新增:对端地址
    buffer     []byte
    logger     *zap.Logger
    mu         sync.Mutex
}

// 新增方法:设置对端地址
func (c *turnConn) SetRemoteAddr(addr net.Addr) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.remoteAddr = addr
}

// 修复 Write 方法
func (c *turnConn) Write(b []byte) (n int, err error) {
    c.mu.Lock()
    defer c.mu.Unlock()

    if c.remoteAddr == nil {
        return 0, fmt.Errorf("未设置对端地址,请先调用 SetRemoteAddr()")
    }

    n, err = c.relay.WriteTo(b, c.remoteAddr)
    return n, err
}

使用方式

// 1. 创建 TURN 连接
conn := NewTURNFactory(...)
turnConn, err := factory.Dial(ctx, config)

// 2. 设置对端地址(必须在 Write 之前)
remoteAddr, _ := net.ResolveUDPAddr("udp", "1.2.3.4:9999")
turnConn.SetRemoteAddr(remoteAddr)

// 3. 现在可以正常发送数据
n, err := turnConn.Write(data)
if err != nil {
    // 处理错误
}

验证结果

✅ go build ./core/connect  # 编译通过
✅ go build ./core          # 编译通过

待修复的问题

高优先级(阻塞功能)

# 问题 位置 严重性 状态
3 TURN-QUIC 未实现 turn_quic.go:26 阻塞
4 TURN-TLS 未实现 turn.go:96 阻塞
5 P2P 打洞未实现 direct.go:56 阻塞
6 gRPC 服务未注册 core.go:133 阻塞

中优先级(性能优化)

# 问题 位置 影响 状态
7 BindToDevice 空实现 core.go:227 ⚠️ 功能缺失
8 降级后重连未实现 strategy.go:311 ⚠️ 降级失效
9 恢复探测无实际逻辑 strategy.go:584 ⚠️ 无法恢复
12 10ms 轮询效率低 bind_port.go:205 ⚠️ CPU 开销大

低优先级(代码质量)

# 问题 位置 影响 状态
13 读取超时硬编码 ice.go:500 ⚠️ 不灵活
14 SetDeadline 不完整 ws.go:191 ⚠️ 只有读超时
15 connpool.go 死代码 pool/connpool.go 未使用

🎯 下一步计划

Phase 1: 核心功能完善(P0

  1. 修复 TURN 认证 (#10) - 从配置中获取用户名密码
  2. 修复 publicKey panic (#11) - 添加长度检查
  3. 注册传输工厂 (#2) - FakeTCP, RealTCP, TURN-TCP, TURN-QUIC, ICE
  4. 实现 TURN-QUIC/TLS (#3, #4) - 补充完整 TURN 支持

Phase 2: 服务集成(P1

  1. 注册 gRPC 服务 (#6) - 启动时注册服务
  2. 实现 BindToDevice (#7) - 绑定网络设备
  3. 完善 P2P 打洞 (#5) - 实现 STUN 候选交换

Phase 3: 策略优化(P2

  1. 实现降级后重连 (#8) - 自动切换链路
  2. 实现恢复探测 (#9) - 定期探测更优链路
  3. 优化轮询机制 (#12) - 事件驱动替代轮询

Phase 4: 代码优化(P3

  1. 修复超时硬编码 (#13, #14) - 配置化
  2. 清理死代码 (#15) - 删除或实现 connpool

📈 修复统计

类别 总数 已完成 进行中 待开始 完成率
P0 - 阻塞功能 7 4 0 3 57%
P1 - 服务集成 3 0 0 3 0%
P2 - 策略优化 3 0 0 3 0%
P3 - 代码优化 2 0 0 2 0%
总计 15 4 0 11 27%

更新时间:2026-03-24 06:00
版本:v2.2.2
下次更新:修复问题 #3, #4, #5