离线库判断为国外, API 判断为国内。Map存储,启动加载

This commit is contained in:
aixiao 2025-01-19 13:01:46 +08:00
parent 99c1276ff6
commit 54fa8d80b2
2 changed files with 70 additions and 6 deletions

BIN
denyip

Binary file not shown.

76
main.go
View File

@ -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() // 主进程逻辑
}