From a07af2f58bfa8c6d0208ed28f927f47cad71fa1f Mon Sep 17 00:00:00 2001 From: xiu2 <54703944+XIU2@users.noreply.github.com> Date: Sat, 29 Apr 2023 23:32:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E6=B5=8B=E9=80=9F?= =?UTF-8?q?=E5=A4=A7=E9=87=8F=E5=AD=90=E7=BD=91=E6=8E=A9=E7=A0=81=20/32=20?= =?UTF-8?q?/128=20=E7=9A=84=20IP=20=E6=97=B6=E5=B0=8F=E6=A6=82=E7=8E=87?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E9=87=8D=E5=A4=8D=20IP=20=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task/ip.go | 68 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/task/ip.go b/task/ip.go index 678a0c5..48f2715 100644 --- a/task/ip.go +++ b/task/ip.go @@ -65,7 +65,7 @@ func (r *IPRanges) fixIP(ip string) string { return ip } -// 解析 IP 段,获得 IP、IP 范围 +// 解析 IP 段,获得 IP、IP 范围、子网掩码 func (r *IPRanges) parseCIDR(ip string) { var err error if r.firstIP, r.ipNet, err = net.ParseCIDR(r.fixIP(ip)); err != nil { @@ -100,40 +100,48 @@ func (r *IPRanges) getIPRange() (minIP, hosts byte) { } func (r *IPRanges) chooseIPv4() { - minIP, hosts := r.getIPRange() - for r.ipNet.Contains(r.firstIP) { - if TestAll { // 如果是测速全部 IP - for i := 0; i <= int(hosts); i++ { // 遍历 IP 最后一段最小值到最大值 - r.appendIPv4(byte(i) + minIP) + if r.mask == "/32" { // 单个 IP 则无需随机,直接加入自身即可 + r.appendIP(r.firstIP) + } else { + minIP, hosts := r.getIPRange() // 返回第四段 IP 的最小值及可用数目 + for r.ipNet.Contains(r.firstIP) { // 只要该 IP 没有超出 IP 网段范围,就继续循环随机 + if TestAll { // 如果是测速全部 IP + for i := 0; i <= int(hosts); i++ { // 遍历 IP 最后一段最小值到最大值 + r.appendIPv4(byte(i) + minIP) + } + } else { // 随机 IP 的最后一段 0.0.0.X + r.appendIPv4(minIP + randIPEndWith(hosts)) } - } else { // 随机 IP 的最后一段 0.0.0.X - r.appendIPv4(minIP + randIPEndWith(hosts)) - } - r.firstIP[14]++ // 0.0.(X+1).X - if r.firstIP[14] == 0 { - r.firstIP[13]++ // 0.(X+1).X.X - if r.firstIP[13] == 0 { - r.firstIP[12]++ // (X+1).X.X.X + r.firstIP[14]++ // 0.0.(X+1).X + if r.firstIP[14] == 0 { + r.firstIP[13]++ // 0.(X+1).X.X + if r.firstIP[13] == 0 { + r.firstIP[12]++ // (X+1).X.X.X + } } } } } func (r *IPRanges) chooseIPv6() { - var tempIP uint8 - for r.ipNet.Contains(r.firstIP) { - if r.mask != "/128" { + if r.mask == "/128" { // 单个 IP 则无需随机,直接加入自身即可 + r.appendIP(r.firstIP) + } else { + var tempIP uint8 // 临时变量,用于记录前一位的值 + for r.ipNet.Contains(r.firstIP) { // 只要该 IP 没有超出 IP 网段范围,就继续循环随机 r.firstIP[15] = randIPEndWith(255) // 随机 IP 的最后一段 r.firstIP[14] = randIPEndWith(255) // 随机 IP 的最后一段 - } - targetIP := make([]byte, len(r.firstIP)) - copy(targetIP, r.firstIP) - r.appendIP(targetIP) - for i := 13; i >= 0; i-- { - tempIP = r.firstIP[i] - r.firstIP[i] += randIPEndWith(255) - if r.firstIP[i] >= tempIP { - break + + targetIP := make([]byte, len(r.firstIP)) + copy(targetIP, r.firstIP) + r.appendIP(targetIP) // 加入 IP 地址池 + + for i := 13; i >= 0; i-- { // 从倒数第三位开始往前随机 + tempIP = r.firstIP[i] // 保存前一位的值 + r.firstIP[i] += randIPEndWith(255) // 随机 0~255,加到当前位上 + if r.firstIP[i] >= tempIP { // 如果当前位的值大于等于前一位的值,说明随机成功了,可以退出该循环 + break + } } } } @@ -148,8 +156,8 @@ func loadIPRanges() []*net.IPAddr { if IP == "" { // 跳过空的(即开头、结尾或连续多个 ,, 的情况) continue } - ranges.parseCIDR(IP) - if isIPv4(IP) { + ranges.parseCIDR(IP) // 解析 IP 段,获得 IP、IP 范围、子网掩码 + if isIPv4(IP) { // 生成要测速的所有 IPv4 / IPv6 地址(单个/随机/全部) ranges.chooseIPv4() } else { ranges.chooseIPv6() @@ -170,8 +178,8 @@ func loadIPRanges() []*net.IPAddr { if line == "" { // 跳过空行 continue } - ranges.parseCIDR(line) - if isIPv4(line) { + ranges.parseCIDR(line) // 解析 IP 段,获得 IP、IP 范围、子网掩码 + if isIPv4(line) { // 生成要测速的所有 IPv4 / IPv6 地址(单个/随机/全部) ranges.chooseIPv4() } else { ranges.chooseIPv6()