离线库判断为国外, API 判断为国内。Map存储,启动加载
This commit is contained in:
parent
99c1276ff6
commit
54fa8d80b2
76
main.go
76
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() // 主进程逻辑
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user