离线库判断为国外, API 判断为国内。Map存储,启动加载
This commit is contained in:
parent
99c1276ff6
commit
54fa8d80b2
76
main.go
76
main.go
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
@ -35,8 +36,8 @@ var (
|
|||||||
IpList = list.New() // 存储 IPv4 地址的链表
|
IpList = list.New() // 存储 IPv4 地址的链表
|
||||||
IpMutex sync.Mutex // 保护 ipList 的互斥锁
|
IpMutex sync.Mutex // 保护 ipList 的互斥锁
|
||||||
|
|
||||||
ProcessedIPMap = make(map[string]struct{}) // 使用 map 存储已处理的 IP
|
ProcessedIPMap = make(map[string]string) // 使用 map 存储已处理的 IP
|
||||||
ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap
|
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() { // 主进程逻辑
|
func runMainProcess() { // 主进程逻辑
|
||||||
|
|
||||||
fmt.Println("主进程启动...")
|
fmt.Println("主进程启动...")
|
||||||
@ -207,8 +266,12 @@ func runMainProcess() { // 主进程逻辑
|
|||||||
|
|
||||||
// 将 IP 标记为已处理,国内地址
|
// 将 IP 标记为已处理,国内地址
|
||||||
ProcessedMutex.Lock()
|
ProcessedMutex.Lock()
|
||||||
ProcessedIPMap[ipStr] = struct{}{}
|
ProcessedIPMap[ipStr] = ""
|
||||||
ProcessedMutex.Unlock()
|
ProcessedMutex.Unlock()
|
||||||
|
|
||||||
|
if err := saveMapToFile("cn.json"); err != nil {
|
||||||
|
log.Printf("实时保存 Map 失败: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -234,9 +297,9 @@ func runMainProcess() { // 主进程逻辑
|
|||||||
|
|
||||||
// 清理 ProcessedIPMap
|
// 清理 ProcessedIPMap
|
||||||
if len(ProcessedIPMap) >= 1024 {
|
if len(ProcessedIPMap) >= 1024 {
|
||||||
ProcessedMutex.Lock() // 锁定互斥锁
|
ProcessedMutex.Lock() // 锁定互斥锁
|
||||||
ProcessedIPMap = make(map[string]struct{}) // 创建一个新的空 map
|
ProcessedIPMap = make(map[string]string) // 创建一个新的空 map
|
||||||
ProcessedMutex.Unlock() // 解锁
|
ProcessedMutex.Unlock() // 解锁
|
||||||
log.Println("ProcessedIPMap 已清空")
|
log.Println("ProcessedIPMap 已清空")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,6 +411,7 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InitMap()
|
||||||
runMainProcess() // 主进程逻辑
|
runMainProcess() // 主进程逻辑
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user