3 Commits

Author SHA1 Message Date
xiu2
166d9abe7c 修复 上个版本更新导致的 IPv6 测速报错的问题。 2020-12-09 16:42:50 +08:00
xiu2
f9c310bfb4 update 2020-12-06 08:20:57 +08:00
xiu2
0d54b65f33 新增 测速全部 IP、检查版本更新 2020-12-05 16:03:21 +08:00
5 changed files with 897 additions and 830 deletions

View File

@@ -5,8 +5,19 @@ import (
"log"
"net"
"os"
"strconv"
"strings"
)
func getCidrHostNum(maskLen int) int {
cidrIpNum := int(0)
var i int = int(32 - maskLen - 1)
for ; i >= 1; i-- {
cidrIpNum += 1 << i
}
return cidrIpNum
}
func loadFirstIPOfRangeFromFile(ipFile string) []net.IPAddr {
file, err := os.Open(ipFile)
if err != nil {
@@ -18,60 +29,69 @@ func loadFirstIPOfRangeFromFile(ipFile string) []net.IPAddr {
for scanner.Scan() {
IPString := scanner.Text()
firstIP, IPRange, err := net.ParseCIDR(IPString)
//fmt.Println(firstIP)
//fmt.Println(IPRange)
Mask, _ := strconv.Atoi(strings.Split(scanner.Text(), "/")[1])
MaxIPNum := getCidrHostNum(Mask) - 1
if MaxIPNum > 253 {
MaxIPNum = 253
}
//fmt.Println(MaxIPNum)
if err != nil {
log.Fatal(err)
}
if ipv6Mode { // IPv6
var tempIP uint8
MaxIPNum = 254
for IPRange.Contains(firstIP) {
//fmt.Println(firstIP)
//fmt.Println(firstIP[0], firstIP[1], firstIP[2], firstIP[3], firstIP[4], firstIP[5], firstIP[6], firstIP[7], firstIP[8], firstIP[9], firstIP[10], firstIP[11], firstIP[12], firstIP[13], firstIP[14], firstIP[15])
firstIP[15] = randipEndWith() // 随机 IP 的最后一段
firstIP[14] = randipEndWith() // 随机 IP 的最后一段
firstIP[15] = randipEndWith(MaxIPNum) // 随机 IP 的最后一段
firstIP[14] = randipEndWith(MaxIPNum) // 随机 IP 的最后一段
firstIPCopy := make([]byte, len(firstIP))
copy(firstIPCopy, firstIP)
firstIPs = append(firstIPs, net.IPAddr{IP: firstIPCopy})
tempIP = firstIP[13]
firstIP[13] += randipEndWith()
firstIP[13] += randipEndWith(MaxIPNum)
if firstIP[13] < tempIP {
tempIP = firstIP[12]
firstIP[12] += randipEndWith()
firstIP[12] += randipEndWith(MaxIPNum)
if firstIP[12] < tempIP {
tempIP = firstIP[11]
firstIP[11] += randipEndWith()
firstIP[11] += randipEndWith(MaxIPNum)
if firstIP[11] < tempIP {
tempIP = firstIP[10]
firstIP[10] += randipEndWith()
firstIP[10] += randipEndWith(MaxIPNum)
if firstIP[10] < tempIP {
tempIP = firstIP[9]
firstIP[9] += randipEndWith()
firstIP[9] += randipEndWith(MaxIPNum)
if firstIP[9] < tempIP {
tempIP = firstIP[8]
firstIP[8] += randipEndWith()
firstIP[8] += randipEndWith(MaxIPNum)
if firstIP[8] < tempIP {
tempIP = firstIP[7]
firstIP[7] += randipEndWith()
firstIP[7] += randipEndWith(MaxIPNum)
if firstIP[7] < tempIP {
tempIP = firstIP[6]
firstIP[6] += randipEndWith()
firstIP[6] += randipEndWith(MaxIPNum)
if firstIP[6] < tempIP {
tempIP = firstIP[5]
firstIP[5] += randipEndWith()
firstIP[5] += randipEndWith(MaxIPNum)
if firstIP[5] < tempIP {
tempIP = firstIP[4]
firstIP[4] += randipEndWith()
firstIP[4] += randipEndWith(MaxIPNum)
if firstIP[4] < tempIP {
tempIP = firstIP[3]
firstIP[3] += randipEndWith()
firstIP[3] += randipEndWith(MaxIPNum)
if firstIP[3] < tempIP {
tempIP = firstIP[2]
firstIP[2] += randipEndWith()
firstIP[2] += randipEndWith(MaxIPNum)
if firstIP[2] < tempIP {
tempIP = firstIP[1]
firstIP[1] += randipEndWith()
firstIP[1] += randipEndWith(MaxIPNum)
if firstIP[1] < tempIP {
tempIP = firstIP[0]
firstIP[0] += randipEndWith()
firstIP[0] += randipEndWith(MaxIPNum)
}
}
}
@@ -88,10 +108,25 @@ func loadFirstIPOfRangeFromFile(ipFile string) []net.IPAddr {
}
} else { //IPv4
for IPRange.Contains(firstIP) {
firstIP[15] = randipEndWith() // 随机 IP 的最后一段 0.0.0.X
firstIPCopy := make([]byte, len(firstIP))
copy(firstIPCopy, firstIP)
firstIPs = append(firstIPs, net.IPAddr{IP: firstIPCopy})
//fmt.Println(firstIP)
//fmt.Println(firstIP[15])
if allip {
for i := 1; i < MaxIPNum+2; i++ {
firstIP[15] = uint8(i) // 随机 IP 的最后一段 0.0.0.X
//fmt.Println(firstIP)
firstIPCopy := make([]byte, len(firstIP))
copy(firstIPCopy, firstIP)
firstIPs = append(firstIPs, net.IPAddr{IP: firstIPCopy})
}
} else {
if firstIP[15] == 0 {
firstIP[15] = randipEndWith(MaxIPNum) // 随机 IP 的最后一段 0.0.0.X
}
firstIPCopy := make([]byte, len(firstIP))
copy(firstIPCopy, firstIP)
firstIPs = append(firstIPs, net.IPAddr{IP: firstIPCopy})
}
firstIP[15] = 0
firstIP[14]++ // 0.0.(X+1).X
if firstIP[14] == 0 {
firstIP[13]++ // 0.(X+1).X.X

View File

@@ -92,8 +92,10 @@ https://github.com/XIU2/CloudflareSpeedTest
禁用下载测速;如果带上该参数就是禁用下载测速;(默认 启用)
-ipv6
IPv6 测速模式;请确保 IP 数据文件内只包含 IPv6 IP段软件不支持同时测速 IPv4+IPv6(默认 IPv4)
-allip
测速全部 IP如果带上该参数将会对每个 IP (仅 IPv4) 进行测速;(默认 每个 IP 段随机测速一个 IP)
-v
打印程序版本
打印程序版本+检查版本更新
-h
打印帮助说明
```

51
main.go
View File

@@ -3,6 +3,8 @@ package main
import (
"flag"
"fmt"
"io/ioutil"
"net/http"
"os"
"runtime"
"sort"
@@ -13,15 +15,9 @@ import (
"github.com/cheggaaa/pb/v3"
)
var version string
var disableDownload bool
var ipv6Mode bool
var tcpPort int
var ipFile string
var outputFile string
var printResultNum int
var timeLimit int
var speedLimit int
var version, ipFile, outputFile, versionNew string
var disableDownload, ipv6Mode, allip bool
var tcpPort, printResultNum, timeLimit, speedLimit int
func init() {
var downloadSecond int64
@@ -55,11 +51,13 @@ https://github.com/XIU2/CloudflareSpeedTest
-o result.csv
输出结果文件;如含有空格请加上引号;为空格时不输出结果文件(-o " ");允许其他后缀;(默认 result.csv)
-dd
禁用下载测速;如果带上该参数就是禁用下载测速;(默认 启用下载测速)
禁用下载测速;如果带上该参数将会禁用下载测速;(默认 启用下载测速)
-ipv6
IPv6 测速模式;请确保 IP 数据文件内只包含 IPv6 IP段软件不支持同时测速 IPv4+IPv6(默认 IPv4)
-allip
测速全部 IP如果带上该参数将会对每个 IP (仅 IPv4) 进行测速;(默认 每个 IP 段随机测速一个 IP)
-v
打印程序版本
打印程序版本+检查版本更新
-h
打印帮助说明
`
@@ -75,6 +73,7 @@ https://github.com/XIU2/CloudflareSpeedTest
flag.IntVar(&printResultNum, "p", 20, "显示结果数量")
flag.BoolVar(&disableDownload, "dd", false, "禁用下载测速")
flag.BoolVar(&ipv6Mode, "ipv6", false, "禁用下载测速")
flag.BoolVar(&allip, "allip", false, "测速全部 IP")
flag.StringVar(&ipFile, "f", "ip.txt", "IP 数据文件")
flag.StringVar(&outputFile, "o", "result.csv", "输出结果文件")
flag.BoolVar(&printVersion, "v", false, "打印程序版本")
@@ -85,6 +84,13 @@ https://github.com/XIU2/CloudflareSpeedTest
flag.Parse()
if printVersion {
println(version)
fmt.Println("检查版本更新中...")
checkUpdate()
if versionNew != "" {
fmt.Println("发现新版本 [" + versionNew + "]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新!")
} else {
fmt.Println("当前为最新版本 [" + version + "]")
}
os.Exit(0)
}
if pingRoutine <= 0 {
@@ -123,6 +129,7 @@ https://github.com/XIU2/CloudflareSpeedTest
}
func main() {
go checkUpdate() // 检查版本更新
initRandSeed() // 置随机数种子
failTime = pingTime // 设置接收次数
ips := loadFirstIPOfRangeFromFile(ipFile) // 读入IP
@@ -221,6 +228,10 @@ func printResult(data []CloudflareIPData) {
}
}
if versionNew != "" {
fmt.Println("\n发现新版本 [" + versionNew + "]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新!")
}
if sysType == "windows" { // 如果是 Windows 系统,则需要按下 回车键 或 Ctrl+C 退出
if outputFile != "" {
fmt.Printf("\n完整测速结果已写入 %v 文件,请使用记事本/表格软件查看。\n按下 回车键 或 Ctrl+C 退出。", outputFile)
@@ -241,3 +252,21 @@ func printResult(data []CloudflareIPData) {
fmt.Println("\n完整测速结果已写入 " + outputFile + " 文件,请使用记事本/表格软件查看。")
}
}
// 检查更新
func checkUpdate() {
timeout := time.Duration(10 * time.Second)
client := http.Client{Timeout: timeout}
res, err := client.Get("https://api.xiuer.pw/ver/cloudflarespeedtest.txt")
if err == nil {
// 读取资源数据 body: []byte
body, err := ioutil.ReadAll(res.Body)
// 关闭资源流
res.Body.Close()
if err == nil {
if string(body) != version {
versionNew = string(body)
}
}
}
}

View File

@@ -16,6 +16,7 @@ import (
func tcping(ip net.IPAddr, tcpPort int) (bool, float32) {
startTime := time.Now()
var fullAddress string
//fmt.Println(ip.String())
if ipv6Mode { // IPv6 需要加上 []
fullAddress = "[" + ip.String() + "]:" + strconv.Itoa(tcpPort)
} else {

View File

@@ -91,8 +91,8 @@ func initRandSeed() {
rand.Seed(time.Now().UnixNano())
}
func randipEndWith() uint8 {
return uint8(rand.Intn(254) + 1)
func randipEndWith(num int) uint8 {
return uint8(rand.Intn(num) + 1)
}
func GetRandomString() string {