diff --git a/IPRangeLoader.go b/IPRangeLoader.go index e06dffd..dd6884e 100644 --- a/IPRangeLoader.go +++ b/IPRangeLoader.go @@ -7,8 +7,8 @@ import ( "os" ) -func loadFirstIPOfRangeFromFile() []net.IPAddr { - file, err := os.Open("ip.txt") +func loadFirstIPOfRangeFromFile(ipFile string) []net.IPAddr { + file, err := os.Open(ipFile) if err != nil { log.Fatal(err) } diff --git a/README.md b/README.md index 25c8aff..f058330 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ 测速完毕后,会把结果保存在当前目录下的 `result.csv` 文件中(只输出丢包率 50% 以下的),用记事本打开,排序为**延迟由低到高**,每一列用逗号分隔,分别是: ``` -IP 地址, Ping 发送次数, Ping 接收次数, Ping 接收率, 平均延迟, 下载速度 (MB/s) -104.27.70.18, 4, 4, 1.0000, 150.7948, 12.8951 +IP 地址, 测试次数, 成功次数, 成功比率, 平均延迟, 下载速度 (MB/s) +104.27.70.18, 4, 4, 1.00, 150.79, 12.89 ``` 选择一个平均延迟与下载速度都不错的 IP 放到 `Hosts` 文件中(指向域名)。 @@ -32,37 +32,41 @@ https://github.com/XIU2/CloudflareSpeedTest 参数: -n 500 - 测速线程数量;请勿超过1000 (默认 500) + 测速线程数量;数值越大速度越快,请勿超过1000(结果误差大);(默认 500) -t 4 - 延迟测速次数;单个 IP 测速次数,TCP协议 (默认 4) + 延迟测速次数;单个 IP 测速次数,为 1 时将过滤丢包的IP,TCP协议;(默认 4) -dn 20 - 下载测速数量;延迟测速后,从最低延迟起测试下载速度的数量,请勿太多 (默认 20) + 下载测速数量;延迟测速并排序后,从最低延迟起测试下载速度的数量,请勿太多(速度慢);(默认 20) -dt 10 - 下载测速时间;单个 IP 测速最长时间,单位:秒 (默认 10) + 下载测速时间;单个 IP 测速最长时间,单位:秒;(默认 10) + -f ip.txt + IP 数据文件;支持相对路径和绝对路径,如果包含空格请前后加上引号;(默认 ip.txt) + -dd + 禁用下载测速;如果带上该参数就是禁用下载测速;(默认 启用) -v 打印程序版本 -h 打印帮助说明 示例: - Windows:CloudflareST.exe -n 800 -t 4 -dn 20 -dt 10 - Linux:CloudflareST -n 800 -t 4 -dn 20 -dt 10 + CloudflareST.exe -n 500 -t 4 -dn 20 -dt 10 + CloudflareST.exe -n 500 -t 4 -dn 20 -dt 10 -f "C:\\abc\ip.txt" -dd ``` #### 使用示例 在 CMD 中运行,或者把启动参数添加到快捷方式中。 -> **注意:** 不需要四个参数都加上,如果你认为某个参数默认就很合适,那就跳过。 +> **注意:** 不需要通顺加上所有参数,按需选择,参数前后顺序随意。 ``` cmd # CMD 示例 -CloudflareST.exe -n 800 -t 4 -dn 20 -dt 10 +CloudflareST.exe -n 500 -t 4 -dn 20 -dt 10 ``` ``` cmd # 快捷方式示例(右键快捷方式 - 目标) ## 如果有引号就放在引号外面,记得引号和 - 之间有空格。 -"D:\Program Files\CloudflareST\CloudflareST.exe" -n 800 -t 4 -dn 20 -dt 10 +"D:\Program Files\CloudflareST\CloudflareST.exe" -n 500 -t 4 -dn 20 -dt 10 ``` **** diff --git a/main.go b/main.go index d8947eb..cec0abb 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,8 @@ import ( ) var version string +var disableDownload bool +var ipFile string func init() { var downloadSecond int64 @@ -23,27 +25,32 @@ https://github.com/XIU2/CloudflareSpeedTest 参数: -n 500 - 测速线程数量;请勿超过1000 (默认 500) + 测速线程数量;数值越大速度越快,请勿超过1000(结果误差大);(默认 500) -t 4 - 延迟测速次数;单个 IP 测速次数,TCP协议 (默认 4) + 延迟测速次数;单个 IP 测速次数,为 1 时将过滤丢包的IP,TCP协议;(默认 4) -dn 20 - 下载测速数量;延迟测速后,从最低延迟起测试下载速度的数量,请勿太多 (默认 20) + 下载测速数量;延迟测速并排序后,从最低延迟起测试下载速度的数量,请勿太多(速度慢);(默认 20) -dt 10 - 下载测速时间;单个 IP 测速最长时间,单位:秒 (默认 10) + 下载测速时间;单个 IP 测速最长时间,单位:秒;(默认 10) + -f ip.txt + IP 数据文件;支持相对路径和绝对路径,如果包含空格请前后加上引号;(默认 ip.txt) + -dd + 禁用下载测速;如果带上该参数就是禁用下载测速;(默认 启用) -v 打印程序版本 -h 打印帮助说明 示例: - Windows:CloudflareST.exe -n 800 -t 4 -dn 20 -dt 10 - Linux:CloudflareST -n 800 -t 4 -dn 20 -dt 10 -` + CloudflareST.exe -n 500 -t 4 -dn 20 -dt 10 + CloudflareST.exe -n 500 -t 4 -dn 20 -dt 10 -f "C:\\abc\ip.txt" -dd` - pingRoutine = *flag.Int("n", 500, "测速线程数量") - pingTime = *flag.Int("t", 4, "延迟测速次数") - downloadTestCount = *flag.Int("dn", 20, "下载测速数量") + flag.IntVar(&pingRoutine, "n", 500, "测速线程数量") + flag.IntVar(&pingTime, "t", 4, "延迟测速次数") + flag.IntVar(&downloadTestCount, "dn", 20, "下载测速数量") flag.Int64Var(&downloadSecond, "dt", 10, "下载测速时间") + flag.BoolVar(&disableDownload, "dd", false, "禁用下载测速") + flag.StringVar(&ipFile, "f", "ip.txt", "IP 数据文件") flag.BoolVar(&printVersion, "v", false, "打印程序版本") downloadTestTime = time.Duration(downloadSecond) * time.Second @@ -57,10 +64,11 @@ https://github.com/XIU2/CloudflareSpeedTest } func main() { - initipEndWith() - ips := loadFirstIPOfRangeFromFile() - pingCount := len(ips) * pingTime - bar := pb.StartNew(pingCount) + initipEndWith() // 随机数 + failTime = pingTime // 设置接收次数 + ips := loadFirstIPOfRangeFromFile(ipFile) // 读入IP + pingCount := len(ips) * pingTime // 计算进度条总数(IP*测试次数) + bar := pb.Full.Start(pingCount) // 进度条总数 var wg sync.WaitGroup var mu sync.Mutex var data = make([]CloudflareIPData, 0) @@ -76,14 +84,17 @@ func main() { } wg.Wait() bar.Finish() - bar = pb.StartNew(downloadTestCount) - sort.Sort(CloudflareIPDataSet(data)) - fmt.Println("开始下载测速:") - for i := 0; i < downloadTestCount; i++ { - _, speed := DownloadSpeedHandler(data[i].ip) - data[i].downloadSpeed = speed - bar.Add(1) + + sort.Sort(CloudflareIPDataSet(data)) // 排序 + if !disableDownload { // 如果禁用下载测速就跳过 + bar = pb.Simple.Start(downloadTestCount) + fmt.Println("开始下载测速:") + for i := 0; i < downloadTestCount; i++ { + _, speed := DownloadSpeedHandler(data[i].ip) + data[i].downloadSpeed = speed + bar.Add(1) + } + bar.Finish() } - bar.Finish() - ExportCsv("./result.csv", data) + ExportCsv("./result.csv", data) // 输出结果 } diff --git a/util.go b/util.go index 8883405..baaad28 100644 --- a/util.go +++ b/util.go @@ -48,9 +48,9 @@ func (cf *CloudflareIPData) toString() []string { result[0] = cf.ip.String() result[1] = strconv.Itoa(cf.pingCount) result[2] = strconv.Itoa(cf.pingReceived) - result[3] = strconv.FormatFloat(float64(cf.getRecvRate()), 'f', 4, 32) - result[4] = strconv.FormatFloat(float64(cf.pingTime), 'f', 4, 32) - result[5] = strconv.FormatFloat(float64(cf.downloadSpeed)/1024/1024, 'f', 4, 32) + result[3] = strconv.FormatFloat(float64(cf.getRecvRate()), 'f', 2, 32) + result[4] = strconv.FormatFloat(float64(cf.pingTime), 'f', 2, 32) + result[5] = strconv.FormatFloat(float64(cf.downloadSpeed)/1024/1024, 'f', 2, 32) return result } @@ -85,7 +85,8 @@ var downloadTestCount int const defaultTcpPort = 443 const tcpConnectTimeout = time.Second * 1 -const failTime = 4 + +var failTime int type CloudflareIPDataSet []CloudflareIPData