修复服务器重启时端口被占用和数据保存问题

This commit is contained in:
Alex Yang
2025-11-28 19:38:21 +08:00
parent 16bc615a52
commit 24b8cf19aa
20 changed files with 820873 additions and 109 deletions

View File

@@ -55,6 +55,7 @@ type Server struct {
shieldConfig *config.ShieldConfig
shieldManager *shield.ShieldManager
server *dns.Server
tcpServer *dns.Server
resolver *dns.Client
ctx context.Context
cancel context.CancelFunc
@@ -159,8 +160,8 @@ func (s *Server) Start() error {
Handler: dns.HandlerFunc(s.handleDNSRequest),
}
// 启动TCP服务器(用于大型响应)
tcpServer := &dns.Server{
// 保存TCP服务器实例以便在Stop方法中关闭
s.tcpServer = &dns.Server{
Addr: fmt.Sprintf(":%d", s.config.Port),
Net: "tcp",
Handler: dns.HandlerFunc(s.handleDNSRequest),
@@ -184,7 +185,7 @@ func (s *Server) Start() error {
// 启动TCP服务
go func() {
logger.Info(fmt.Sprintf("DNS TCP服务器启动监听端口: %d", s.config.Port))
if err := tcpServer.ListenAndServe(); err != nil {
if err := s.tcpServer.ListenAndServe(); err != nil {
logger.Error("DNS TCP服务器启动失败", "error", err)
s.cancel()
}
@@ -218,6 +219,9 @@ func (s *Server) Stop() {
if s.server != nil {
s.server.Shutdown()
}
if s.tcpServer != nil {
s.tcpServer.Shutdown()
}
logger.Info("DNS服务器已停止")
}
@@ -783,11 +787,18 @@ func (s *Server) saveStatsData() {
return
}
// 创建数据目录
statsDir := filepath.Dir(s.config.StatsFile)
err := os.MkdirAll(statsDir, 0755)
// 获取绝对路径以避免工作目录问题
statsFilePath, err := filepath.Abs(s.config.StatsFile)
if err != nil {
logger.Error("创建统计数据目录失败", "error", err)
logger.Error("获取统计文件绝对路径失败", "path", s.config.StatsFile, "error", err)
return
}
// 创建数据目录
statsDir := filepath.Dir(statsFilePath)
err = os.MkdirAll(statsDir, 0755)
if err != nil {
logger.Error("创建统计数据目录失败", "dir", statsDir, "error", err)
return
}
@@ -849,13 +860,13 @@ func (s *Server) saveStatsData() {
}
// 写入文件
err = ioutil.WriteFile(s.config.StatsFile, jsonData, 0644)
err = os.WriteFile(statsFilePath, jsonData, 0644)
if err != nil {
logger.Error("保存统计数据到文件失败", "error", err)
logger.Error("保存统计数据到文件失败", "file", statsFilePath, "error", err)
return
}
logger.Info("统计数据保存成功")
logger.Info("统计数据保存成功", "file", statsFilePath)
}
// startCpuUsageMonitor 启动CPU使用率监控