From 2dfea884a2098ea1410ade5af18110d60ace938f Mon Sep 17 00:00:00 2001 From: XIU2 <54703944+XIU2@users.noreply.github.com> Date: Mon, 31 Aug 2020 00:44:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E8=A1=8C=E5=90=AF=E5=8A=A8=E5=8F=82=E6=95=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++------ main.go | 71 +++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 107 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index f2d9b5d..81c69d8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,64 @@ -# CloudflareScanner +# CloudflareSpeedTest -本项目可以测试Cloudflare节点接入速度 +国外很多网站都在使用 Cloudflare CDN,但分配给中国访客的 IP 并不友好。 +而 Cloudflare 也公开了其所有 [IP 段](https://www.cloudflare.com/ips/) ,但想要在这么多 IP 中找到适合自己的,怕是要累死,所以就有了这个软件:**CloudflareSpeedTest(简称CloudflareST)**! +该软件可以**测试 Cloudflare CDN 所有 IP 的延迟和速度,获取最佳 IP**! +你可以将 IP 添加到 `Hosts` 文件中,来帮你提高访问使用 Cloudflare CDN 服务的网站速度! -程序运行完毕后,结果会保存在当前目录的`result.csv`下 +**** +### 快速使用 -## 注意事项 -#### 协程数请不要调过1000,否则容易出现较大误差 -#### 编译选项为 `go build` -#### 您可在release界面下载或编译运行 +下载编译好的可执行文件 [蓝奏云](https://www.lanzoux.com/b0742hkxe) / [Github](https://github.com/XIU2/CloudflareSpeedTest/releases) 并解压。 +双击运行 `CloudflareST.exe`文件(Windows系统),等待测速... +测速完毕后,会把结果保存在当前目录下的 `result.csv` 文件中,用记事本打开,按照**延迟由低到高排序**。 + +**** +### 进阶使用 + +直接双击运行使用的是默认参数,如果想要测试速度更快、测试结果更全面,可以自定义参数。 +``` cmd +C:\>CloudflareST.exe -h +CloudflareSpeedTest + 测试 Cloudflare CDN 所有 IP 的延迟和速度,获取最佳 IP! + https://github.com/XIU2/CloudflareSpeedTest + +参数: + -n 500 + 测速线程数量;请勿超过1000 (default 500) + -t 4 + 延迟测速次数;单个 IP (default 4) + -dn 10 + 下载测速数量;延迟测速后,从最低延迟起测试下载速度的数量,请勿太多 (default 10) + -dt 10 + 下载测试时间;单个 IP 测速最长时间,单位:秒 (default 10) + -v + 打印程序版本 + -h + 打印帮助说明 + +示例: + Windows:CloudflareST.exe -n 800 -t 4 -dn 10 -dt 10 + Linux:CloudflareST -n 800 -t 4 -dn 10 -dt 10 +``` + +## 使用示例 + +在 CMD 中运行,或者把启动参数添加到快捷方式中。 +> 注意:不需要四个参数都加上,如果你认为某个参数默认就很合适,那就跳过。 +``` cmd +# CMD 示例 +CloudflareST.exe -n 800 -t 4 -dn 10 -dt 10 +``` +``` cmd +# 快捷方式示例(右键快捷方式 - 目标) +## 如果有引号就放在引号外面,记得引号和 - 之间有空格。 +"D:\Program Files\CloudflareST\CloudflareST.exe" -n 800 -t 4 -dn 10 -dt 10 +``` + +**** +### 感谢项目 +https://github.com/Spedoske/CloudflareScanner + +**** +### 许可证 +The GPL-3.0 License. \ No newline at end of file diff --git a/main.go b/main.go index c5bc1c9..35ac204 100644 --- a/main.go +++ b/main.go @@ -1,41 +1,62 @@ package main import ( + "flag" "fmt" - "github.com/cheggaaa/pb/v3" + "os" "sort" "sync" "time" + + "github.com/cheggaaa/pb/v3" ) -func handleUserInput() { - fmt.Println("请输入扫描协程数(数字越大越快,默认400):") - fmt.Scanln(&pingRoutine) - if pingRoutine <= 0 { - pingRoutine = 400 - } - fmt.Println("请输入tcping次数(默认10):") - fmt.Scanln(&pingTime) - if pingTime <= 0 { - pingTime = 10 - } - fmt.Println("请输入要测试的下载节点个数(默认10):") - fmt.Scanln(&downloadTestCount) - if downloadTestCount <= 0 { - downloadTestCount = 10 - } - fmt.Println("请输入下载测试时间(默认10,单位为秒):") +var version string + +func init() { var downloadSecond int64 - fmt.Scanln(&downloadSecond) - if downloadSecond <= 0 { - downloadSecond = 10 - } + var printVersion bool + const help = `CloudflareSpeedTest + 测试 Cloudflare CDN 所有 IP 的延迟和速度,获取最佳 IP! + https://github.com/XIU2/CloudflareSpeedTest + +参数: + -n 500 + 测速线程数量;请勿超过1000 (default 500) + -t 4 + 延迟测速次数;单个 IP (default 4) + -dn 10 + 下载测速数量;延迟测速后,从最低延迟起测试下载速度的数量,请勿太多 (default 10) + -dt 10 + 下载测试时间;单个 IP 测速最长时间,单位:秒 (default 10) + -v + 打印程序版本 + -h + 打印帮助说明 + +示例: + Windows:CloudflareST.exe -n 800 -t 4 -dn 10 -dt 10 + Linux:CloudflareST -n 800 -t 4 -dn 10 -dt 10 +` + + pingRoutine = *flag.Int("n", 500, "测速线程数量;请勿超过1000") + pingTime = *flag.Int("t", 4, "延迟测速次数;单个 IP") + downloadTestCount = *flag.Int("dn", 10, "下载测速数量;延迟测速后,从最低延迟起测试下载速度的数量,请勿太多") + flag.Int64Var(&downloadSecond, "dt", 10, "下载测速时间;单个 IP 测速最长时间,单位:秒") + flag.BoolVar(&printVersion, "v", false, "打印程序版本") + downloadTestTime = time.Duration(downloadSecond) * time.Second + + flag.Usage = func() { fmt.Print(help) } + flag.Parse() + if printVersion { + println(version) + os.Exit(0) + } } func main() { initipEndWith() - handleUserInput() ips := loadFirstIPOfRangeFromFile() pingCount := len(ips) * pingTime bar := pb.StartNew(pingCount) @@ -43,7 +64,7 @@ func main() { var mu sync.Mutex var data = make([]CloudflareIPData, 0) - fmt.Println("开始tcping") + fmt.Println("开始延迟测速(TCP):") control := make(chan bool, pingRoutine) for _, ip := range ips { @@ -56,7 +77,7 @@ func main() { bar.Finish() bar = pb.StartNew(downloadTestCount) sort.Sort(CloudflareIPDataSet(data)) - fmt.Println("开始下载测速") + fmt.Println("开始下载测速:") for i := 0; i < downloadTestCount; i++ { _, speed := DownloadSpeedHandler(data[i].ip) data[i].downloadSpeed = speed