IP获取方式完善
This commit is contained in:
parent
6096e2b655
commit
d621095e14
93
task/ip.go
93
task/ip.go
@ -4,10 +4,11 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,16 +32,20 @@ var (
|
|||||||
}
|
}
|
||||||
IPCidrApi = "https://api.cloudflare.com/client/v4/ips"
|
IPCidrApi = "https://api.cloudflare.com/client/v4/ips"
|
||||||
IsOff = false
|
IsOff = false
|
||||||
|
MaxMS int
|
||||||
|
MinMS int
|
||||||
|
TestAll = false
|
||||||
|
randGen *rand.Rand
|
||||||
)
|
)
|
||||||
|
|
||||||
type IPRangeList struct {
|
type IPRangeList struct {
|
||||||
Ips []*net.IPAddr
|
Ips []*net.IPAddr
|
||||||
unusedIpCount int
|
unusedIpCount int
|
||||||
delays []IPDelay
|
Delays []IPDelay
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func InitRandSeed() {
|
||||||
rand.Seed(time.Now().UnixNano())
|
randGen = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateData 从IP列表中选择一定数量的IP返回
|
// CreateData 从IP列表中选择一定数量的IP返回
|
||||||
@ -49,45 +54,26 @@ func CreateData() *IPRangeList {
|
|||||||
return &IPRangeList{
|
return &IPRangeList{
|
||||||
Ips: ips,
|
Ips: ips,
|
||||||
unusedIpCount: 0,
|
unusedIpCount: 0,
|
||||||
delays: []IPDelay{},
|
Delays: []IPDelay{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// loadIPRanges 从CIDR列表中加载IP地址
|
// loadIPRanges 从CIDR列表中加载IP地址
|
||||||
func loadIPRanges(ciders []string) []*net.IPAddr {
|
func loadIPRanges(ipList []string) []*net.IPAddr {
|
||||||
var ipAddresses []*net.IPAddr
|
ranges := newIPRanges()
|
||||||
for _, cidr := range ciders {
|
for _, ip := range ipList {
|
||||||
_, ipnet, err := net.ParseCIDR(cidr)
|
line := strings.TrimSpace(ip) // 去除首尾的空白字符(空格、制表符、换行符等)
|
||||||
if err != nil {
|
if line == "" { // 跳过空行
|
||||||
fmt.Printf("解析CIDR %s 时出错: %v\n", cidr, err)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// 计算给定IPNet的范围
|
ranges.parseCIDR(line) // 解析 IP 段,获得 IP、IP 范围、子网掩码
|
||||||
ones, _ := ipnet.Mask.Size()
|
if IsIpv4(line) { // 生成要测速的所有 IPv4 / IPv6 地址(单个/随机/全部)
|
||||||
if ones > 24 {
|
ranges.chooseIPv4()
|
||||||
fmt.Printf("CIDR %s 小于 /24\n", cidr)
|
} else {
|
||||||
continue
|
ranges.chooseIPv6()
|
||||||
}
|
|
||||||
numSubnets := 1 << (24 - ones)
|
|
||||||
for i := 0; i < numSubnets; i++ {
|
|
||||||
ip := generateRandomIP(ipnet, i)
|
|
||||||
ipAddresses = append(ipAddresses, ip)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ipAddresses
|
return ranges.ips
|
||||||
}
|
|
||||||
|
|
||||||
// generateRandomIP 在给定IPNet范围内生成随机IP地址
|
|
||||||
func generateRandomIP(ipnet *net.IPNet, subnetIndex int) *net.IPAddr {
|
|
||||||
ip := ipnet.IP.To4()
|
|
||||||
if ip == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// 设置第三个字节为子网索引
|
|
||||||
ip[2] = ip[2] + byte(subnetIndex)
|
|
||||||
// 为最后一个字节生成随机值
|
|
||||||
ip[3] = byte(rand.Intn(256))
|
|
||||||
return &net.IPAddr{IP: ip}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetIPv4List 获取IPv4 CIDR列表
|
// GetIPv4List 获取IPv4 CIDR列表
|
||||||
@ -107,7 +93,7 @@ func GetIPv4List() []string {
|
|||||||
}(resp.Body)
|
}(resp.Body)
|
||||||
|
|
||||||
// 读取响应主体
|
// 读取响应主体
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("获取在线列表失败,正在使用内置列表")
|
fmt.Println("获取在线列表失败,正在使用内置列表")
|
||||||
return Ipv4Cidr
|
return Ipv4Cidr
|
||||||
@ -121,7 +107,7 @@ func GetIPv4List() []string {
|
|||||||
Success bool `json:"success"`
|
Success bool `json:"success"`
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := json.Unmarshal(body, &data); err != nil || !data.Success {
|
if err = json.Unmarshal(body, &data); err != nil || !data.Success {
|
||||||
fmt.Println("获取在线列表失败,正在使用内置列表")
|
fmt.Println("获取在线列表失败,正在使用内置列表")
|
||||||
return Ipv4Cidr
|
return Ipv4Cidr
|
||||||
}
|
}
|
||||||
@ -130,7 +116,38 @@ func GetIPv4List() []string {
|
|||||||
return data.Result.IPv4CIDRs
|
return data.Result.IPv4CIDRs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExcludeInvalid 排除不合格节点
|
||||||
|
func (p *IPRangeList) ExcludeInvalid() []IPDelay {
|
||||||
|
// 初始化一个空IPDelay切片
|
||||||
|
var delays []IPDelay
|
||||||
|
// 遍历IPRangeList的Delays切片
|
||||||
|
for ip, delay := range p.Delays {
|
||||||
|
// 如果最大延迟大于0且小于最大延迟
|
||||||
|
if MaxMS > 0 && delay.Delay > time.Duration(MaxMS)*time.Millisecond {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 如果最小延迟大于0且大于最小延迟
|
||||||
|
if MinMS > 0 && delay.Delay < time.Duration(MinMS)*time.Millisecond {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 将IPDelay的IP和Delay添加到delays切片中
|
||||||
|
delays = append(delays, IPDelay{IP: p.Ips[ip], Delay: delay.Delay, DownloadSpeed: 0})
|
||||||
|
}
|
||||||
|
return delays
|
||||||
|
}
|
||||||
|
|
||||||
|
// SortNodesDesc 按延迟降序排列
|
||||||
|
func SortNodesDesc(p []IPDelay) []IPDelay {
|
||||||
|
sorted := make([]IPDelay, len(p))
|
||||||
|
_ = copy(sorted, p)
|
||||||
|
// 使用sort.Slice 对切片进行排序
|
||||||
|
sort.Slice(sorted, func(i, j int) bool {
|
||||||
|
return sorted[i].Delay < sorted[j].Delay
|
||||||
|
})
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
|
||||||
// IsIpv4 检查IP地址是否为IPv4
|
// IsIpv4 检查IP地址是否为IPv4
|
||||||
func IsIpv4(ip string) bool {
|
func IsIpv4(ip string) bool {
|
||||||
return net.ParseIP(ip) != nil
|
return strings.Contains(ip, ".")
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user