diff --git a/denyip b/denyip index 9282459..6eb66b5 100644 Binary files a/denyip and b/denyip differ diff --git a/main.go b/main.go index 5d713bc..73826ae 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "container/list" + "encoding/json" "flag" "fmt" "log" @@ -35,8 +36,8 @@ var ( IpList = list.New() // 存储 IPv4 地址的链表 IpMutex sync.Mutex // 保护 ipList 的互斥锁 - ProcessedIPMap = make(map[string]struct{}) // 使用 map 存储已处理的 IP - ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap + ProcessedIPMap = make(map[string]string) // 使用 map 存储已处理的 IP + ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap ) // 启动子进程 @@ -152,6 +153,64 @@ func runChildProcess() { } } +// 保存ProcessedIPMap到文件 +func saveMapToFile(filePath string) error { + ProcessedMutex.Lock() + defer ProcessedMutex.Unlock() + + file, err := os.Create(filePath) + if err != nil { + return fmt.Errorf("创建文件失败: %w", err) + } + defer file.Close() + + encoder := json.NewEncoder(file) + if err := encoder.Encode(ProcessedIPMap); err != nil { + return fmt.Errorf("编码 ProcessedIPMap 失败: %w", err) + } + + log.Println("ProcessedIPMap 已成功保存到文件") + return nil +} + +// 增加从文件加载的函数 +func loadMapFromFile(filePath string) error { + ProcessedMutex.Lock() + defer ProcessedMutex.Unlock() + + file, err := os.Open(filePath) + if err != nil { + if os.IsNotExist(err) { + log.Println("文件不存在,跳过加载 Map") + return nil // 文件不存在不是致命错误 + } + return fmt.Errorf("打开文件失败: %w", err) + } + defer file.Close() + + decoder := json.NewDecoder(file) + if err := decoder.Decode(&ProcessedIPMap); err != nil { + return fmt.Errorf("解码 Map 失败: %w", err) + } + + log.Println("Map 已成功从文件加载") + return nil +} + +func InitMap() { + if err := loadMapFromFile("cn.json"); err != nil { + log.Fatalf("加载 Map 失败: %v", err) + } + + defer func() { + // 程序退出时保存数据 + if err := saveMapToFile("cn.json"); err != nil { + log.Printf("保存 Map 失败: %v", err) + } + }() + +} + func runMainProcess() { // 主进程逻辑 fmt.Println("主进程启动...") @@ -207,8 +266,12 @@ func runMainProcess() { // 主进程逻辑 // 将 IP 标记为已处理,国内地址 ProcessedMutex.Lock() - ProcessedIPMap[ipStr] = struct{}{} + ProcessedIPMap[ipStr] = "" ProcessedMutex.Unlock() + + if err := saveMapToFile("cn.json"); err != nil { + log.Printf("实时保存 Map 失败: %v", err) + } } } } @@ -234,9 +297,9 @@ func runMainProcess() { // 主进程逻辑 // 清理 ProcessedIPMap if len(ProcessedIPMap) >= 1024 { - ProcessedMutex.Lock() // 锁定互斥锁 - ProcessedIPMap = make(map[string]struct{}) // 创建一个新的空 map - ProcessedMutex.Unlock() // 解锁 + ProcessedMutex.Lock() // 锁定互斥锁 + ProcessedIPMap = make(map[string]string) // 创建一个新的空 map + ProcessedMutex.Unlock() // 解锁 log.Println("ProcessedIPMap 已清空") } @@ -348,6 +411,7 @@ func main() { return } + InitMap() runMainProcess() // 主进程逻辑 }