feat: TCP 监听也支持条件判断

- server.addr 为空或 ':0' 时不监听 TCP
- 两个都为空时启动报错,至少要配一个
- 灵活组合:仅TCP / 仅Unix / 双监听
This commit is contained in:
2026-05-28 16:03:11 +08:00
parent 2f3d47a439
commit 825df3c26c
+31 -17
View File
@@ -155,39 +155,53 @@ func main() {
} }
} }
// 启动服务器:同时监听 TCP 和 Unix socket(如果配置了的话) // 启动服务器:TCP 和 Unix socket 按配置监听
var wg sync.WaitGroup addr := config.Cfg.Server.Addr
unix := config.Cfg.Server.Unix
if config.Cfg.Server.Unix != "" { if addr == "" && unix == "" {
log.Fatal("未配置任何监听地址,请设置 server.addr 或 server.unix")
}
var wg sync.WaitGroup
started := 0
if unix != "" {
wg.Add(1) wg.Add(1)
started++
go func() { go func() {
defer wg.Done() defer wg.Done()
// 清理残留的 socket 文件 // 清理残留的 socket 文件
os.Remove(config.Cfg.Server.Unix) os.Remove(unix)
listener, err := net.Listen("unix", config.Cfg.Server.Unix) listener, err := net.Listen("unix", unix)
if err != nil { if err != nil {
log.Fatalf("监听 Unix socket 失败: %v", err) log.Fatalf("监听 Unix socket 失败: %v", err)
} }
// 设置 socket 文件权限,允许 nginx 等其他进程访问 // 设置 socket 文件权限,允许 nginx 等其他进程访问
os.Chmod(config.Cfg.Server.Unix, 0666) os.Chmod(unix, 0666)
log.Printf("监听 Unix socket: %s", config.Cfg.Server.Unix) log.Printf("监听 Unix socket: %s", unix)
if err := r.RunListener(listener); err != nil { if err := r.RunListener(listener); err != nil {
log.Fatalf("Unix socket 服务启动失败: %v", err) log.Fatalf("Unix socket 服务启动失败: %v", err)
} }
}() }()
} }
// TCP 始终监听 if addr != "" && addr != ":0" {
wg.Add(1) wg.Add(1)
go func() { started++
defer wg.Done() go func() {
addr := config.Cfg.Server.Addr defer wg.Done()
log.Printf("监听 TCP: %s", addr) log.Printf("监听 TCP: %s", addr)
if err := r.Run(addr); err != nil { if err := r.Run(addr); err != nil {
log.Fatalf("TCP 服务启动失败: %v", err) log.Fatalf("TCP 服务启动失败: %v", err)
} }
}() }()
}
if started == 0 {
log.Fatal("未配置任何有效监听地址")
}
wg.Wait() wg.Wait()
} }