1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| package main
import ( "flag" "fmt" "io/ioutil" "net/http" "os" "runtime" "time"
"CloudflareSpeedTest/task" "CloudflareSpeedTest/utils" )
var ( version, versionNew string )
func init() { var printVersion bool var help = ` CloudflareSpeedTest ` + version + ` 测试 Cloudflare CDN 所有 IP 的延迟和速度,获取最快 IP (IPv4+IPv6)! https://github.com/XIU2/CloudflareSpeedTest 参数: -n 200 测速线程数量;越多测速越快,性能弱的设备 (如路由器) 请勿太高;(默认 200 最多 1000) -t 4 延迟测速次数;单个 IP 延迟测速次数,为 1 时将过滤丢包的IP,TCP协议;(默认 4 次) -tp 443 指定测速端口;延迟测速/下载测速时使用的端口;(默认 443 端口) -dn 10 下载测速数量;延迟测速并排序后,从最低延迟起下载测速的数量;(默认 10 个) -dt 10 下载测速时间;单个 IP 下载测速最长时间,不能太短;(默认 10 秒) -url https://cf.xiu2.xyz/url 下载测速地址;用来下载测速的 Cloudflare CDN 文件地址,默认地址不保证可用性,建议自建; -tl 200 平均延迟上限;只输出低于指定平均延迟的 IP,可与其他上限/下限搭配;(默认 9999 ms) -tll 40 平均延迟下限;只输出高于指定平均延迟的 IP,可与其他上限/下限搭配、过滤假墙 IP;(默认 0 ms) -sl 5 下载速度下限;只输出高于指定下载速度的 IP,凑够指定数量 [-dn] 才会停止测速;(默认 0.00 MB/s) -p 10 显示结果数量;测速后直接显示指定数量的结果,为 0 时不显示结果直接退出;(默认 10 个) -f ip.txt IP段数据文件;如路径含有空格请加上引号;支持其他 CDN IP段;(默认 ip.txt) -o result.csv 写入结果文件;如路径含有空格请加上引号;值为空时不写入文件 [-o ""];(默认 result.csv) -dd 禁用下载测速;禁用后测速结果会按延迟排序 (默认按下载速度排序);(默认 启用) -ipv6 IPv6测速模式;确保 IP 段数据文件内只包含 IPv6 IP段,软件不支持同时测速 IPv4+IPv6;(默认 IPv4) -allip 测速全部的IP;对 IP 段中的每个 IP (仅支持 IPv4) 进行测速;(默认 每个 IP 段随机测速一个 IP) -v 打印程序版本+检查版本更新 -h 打印帮助说明 ` var minDelay, maxDelay, downloadTime int flag.IntVar(&task.Routines, "n", 200, "测速线程数量") flag.IntVar(&task.PingTimes, "t", 4, "延迟测速次数") flag.IntVar(&task.TCPPort, "tp", 443, "指定测速端口") flag.IntVar(&maxDelay, "tl", 9999, "平均延迟上限") flag.IntVar(&minDelay, "tll", 0, "平均延迟下限") flag.IntVar(&downloadTime, "dt", 10, "下载测速时间") flag.IntVar(&task.TestCount, "dn", 10, "下载测速数量") flag.StringVar(&task.URL, "url", "https://cf.xiu2.xyz/url", "下载测速地址") flag.BoolVar(&task.Disable, "dd", false, "禁用下载测速") flag.BoolVar(&task.IPv6, "ipv6", false, "启用IPv6") flag.BoolVar(&task.TestAll, "allip", false, "测速全部 IP") flag.StringVar(&task.IPFile, "f", "ip.txt", "IP 数据文件") flag.Float64Var(&task.MinSpeed, "sl", 0, "下载速度下限") flag.IntVar(&utils.PrintNum, "p", 10, "显示结果数量") flag.StringVar(&utils.Output, "o", "result.csv", "输出结果文件") flag.BoolVar(&printVersion, "v", false, "打印程序版本") flag.Usage = func() { fmt.Print(help) } flag.Parse()
if task.MinSpeed > 0 && time.Duration(maxDelay)*time.Millisecond == utils.InputMaxDelay { fmt.Println("[小提示] 在使用 [-sl] 参数时,建议搭配 [-tl] 参数,以避免因凑不够 [-dn] 数量而一直测速...") } utils.InputMaxDelay = time.Duration(maxDelay) * time.Millisecond utils.InputMinDelay = time.Duration(minDelay) * time.Millisecond task.Timeout = time.Duration(downloadTime) * time.Second
if printVersion { println(version) fmt.Println("检查版本更新中...") checkUpdate() if versionNew != "" { fmt.Printf("*** 发现新版本 [%s]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新! ***", versionNew) } else { fmt.Println("当前为最新版本 [" + version + "]!") } os.Exit(0) } }
func main() { go checkUpdate() task.InitRandSeed()
fmt.Printf("# XIU2/CloudflareSpeedTest %s \n\n", version)
pingData := task.NewPing().Run().FilterDelay() speedData := task.TestDownloadSpeed(pingData) utils.ExportCsv(speedData) speedData.Print(task.IPv6)
if versionNew != "" { fmt.Printf("\n*** 发现新版本 [%s]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新! ***\n", versionNew) } endPrint() }
func endPrint() { if utils.NoPrintResult() { return } if runtime.GOOS == "windows" { fmt.Printf("按下 回车键 或 Ctrl+C 退出。") var pause int fmt.Scanln(&pause) } }
func checkUpdate() { timeout := 10 * time.Second client := http.Client{Timeout: timeout} res, err := client.Get("https://api.xiu2.xyz/ver/cloudflarespeedtest.txt") if err != nil { return } body, err := ioutil.ReadAll(res.Body) if err != nil { return } defer res.Body.Close() if string(body) != version { versionNew = string(body) } }
|