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
+23 -9
View File
@@ -155,39 +155,53 @@ func main() {
}
}
// 启动服务器:同时监听 TCP 和 Unix socket(如果配置了的话)
var wg sync.WaitGroup
// 启动服务器:TCP 和 Unix socket 按配置监听
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)
started++
go func() {
defer wg.Done()
// 清理残留的 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 {
log.Fatalf("监听 Unix socket 失败: %v", err)
}
// 设置 socket 文件权限,允许 nginx 等其他进程访问
os.Chmod(config.Cfg.Server.Unix, 0666)
log.Printf("监听 Unix socket: %s", config.Cfg.Server.Unix)
os.Chmod(unix, 0666)
log.Printf("监听 Unix socket: %s", unix)
if err := r.RunListener(listener); err != nil {
log.Fatalf("Unix socket 服务启动失败: %v", err)
}
}()
}
// TCP 始终监听
if addr != "" && addr != ":0" {
wg.Add(1)
started++
go func() {
defer wg.Done()
addr := config.Cfg.Server.Addr
log.Printf("监听 TCP: %s", addr)
if err := r.Run(addr); err != nil {
log.Fatalf("TCP 服务启动失败: %v", err)
}
}()
}
if started == 0 {
log.Fatal("未配置任何有效监听地址")
}
wg.Wait()
}