mirror of
https://github.com/XIU2/CloudflareSpeedTest.git
synced 2026-04-19 04:38:00 +08:00
Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
760829d026 | ||
|
|
62e8625efa | ||
|
|
1e4400bc9a | ||
|
|
e4a12e2e5b | ||
|
|
2de42f8d30 | ||
|
|
bcbf7f0e2a | ||
|
|
f735c0f5b3 | ||
|
|
7fbe1d1b56 | ||
|
|
6eaacd6b2c | ||
|
|
b955387787 | ||
|
|
e57e9d3897 | ||
|
|
801dd53774 | ||
|
|
e03a371e19 | ||
|
|
346b27f011 | ||
|
|
4f9ca03008 | ||
|
|
d76a8bc749 | ||
|
|
3cd9a35994 | ||
|
|
574e419ee1 | ||
|
|
d66b2aa1f0 | ||
|
|
a392fddd3a | ||
|
|
2bb2f509d9 | ||
|
|
3cf898701f | ||
|
|
74267eb2ac | ||
|
|
bf1bd561da | ||
|
|
b5e741ea3e | ||
|
|
6099b48007 |
206
README.md
206
README.md
@@ -15,7 +15,7 @@
|
||||
> _[**UserScript** - 🐵 Github 高速下载、知乎增强、自动无缝翻页、护眼模式 等十几个**油猴脚本**~](https://github.com/XIU2/UserScript) <img src="https://img.shields.io/github/stars/XIU2/UserScript.svg?style=flat-square&label=Star&color=4285dd&logo=github" height="16px" />_
|
||||
> _[**SNIProxy** - 🧷 自用的简单 SNI Proxy(支持全平台、全系统、前置代理、配置简单等~](https://github.com/XIU2/SNIProxy) <img src="https://img.shields.io/github/stars/XIU2/SNIProxy.svg?style=flat-square&label=Star&color=4285dd&logo=github" height="16px" />_
|
||||
|
||||
> 本项目也支持对**其他 CDN / 网站 IP** 延迟测速(如:[CloudFront](https://github.com/XIU2/CloudflareSpeedTest/discussions/304)、[Gcore](https://github.com/XIU2/CloudflareSpeedTest/discussions/303) CDN),但下载测速需自行寻找地址
|
||||
当然了,本项目也支持对 **`其他 CDN / 多个解析 IP 的网站`** 延迟测速,但相对应的下载测速地址需自行寻找。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Cloudflare CDN 已**明文禁止代理**方式使用,对于**代理套 CDN** 的自行承担风险,请勿过度依赖 [#382](https://github.com/XIU2/CloudflareSpeedTest/discussions/382) [#383](https://github.com/XIU2/CloudflareSpeedTest/discussions/383)
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
### 下载运行
|
||||
|
||||
1. 下载编译好的可执行文件( [Github Releases](https://github.com/XIU2/CloudflareSpeedTest/releases) / [蓝奏云](https://pan.lanpw.com/b0742hkxe) )并解压。
|
||||
1. 下载编译好的可执行文件( [Github Releases](https://github.com/XIU2/CloudflareSpeedTest/releases) / [蓝奏云](https://xiu.lanzoub.com/b0742hkxe) )并解压。
|
||||
2. 双击运行 `cfst.exe` 文件(Windows 系统),等待测速完成...
|
||||
|
||||
<details>
|
||||
@@ -33,7 +33,8 @@
|
||||
|
||||
****
|
||||
|
||||
通过scoop安装:
|
||||
如果你有 scoop(Windows 下的命令行安装程序),则可以这样安装:
|
||||
|
||||
```sh
|
||||
# 添加最多人使用的中文软件包仓库:dorado
|
||||
scoop bucket add dorado https://github.com/chawyehsu/dorado
|
||||
@@ -58,13 +59,13 @@ mkdir cfst
|
||||
cd cfst
|
||||
|
||||
# 下载 CFST 压缩包(自行根据需求替换 URL 中 [版本号] 和 [文件名])
|
||||
wget -N https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.2/cfst_linux_amd64.tar.gz
|
||||
wget -N https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
|
||||
# 如果你是在国内网络环境中下载,那么请使用下面这几个镜像加速之一:
|
||||
# wget -N https://ghfast.top/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.2/cfst_linux_arm64.tar.gz
|
||||
# wget -N https://wget.la/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.2/cfst_linux_arm64.tar.gz
|
||||
# wget -N https://ghproxy.net/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.2/cfst_linux_arm64.tar.gz
|
||||
# wget -N https://gh-proxy.com/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.2/cfst_linux_arm64.tar.gz
|
||||
# wget -N https://hk.gh-proxy.com/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.2/cfst_linux_arm64.tar.gz
|
||||
# wget -N https://wget.la/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
|
||||
# wget -N https://ghfast.top/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
|
||||
# wget -N https://ghproxy.it/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
|
||||
# wget -N https://gh-proxy.org/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
|
||||
# wget -N https://cdn.gh-proxy.org/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
|
||||
# 如果下载失败的话,尝试删除 -N 参数(如果是为了更新,则记得提前删除旧压缩包 rm cfst_linux_amd64.tar.gz )
|
||||
|
||||
# 解压(不需要删除旧文件,会直接覆盖,自行根据需求替换 文件名)
|
||||
@@ -77,7 +78,7 @@ chmod +x cfst
|
||||
./cfst
|
||||
|
||||
# 运行(带参数示例)
|
||||
./cfst -dd -tll 90
|
||||
./cfst -tl 200 -dn 20
|
||||
```
|
||||
|
||||
> 如果平**均延迟非常低**(如 0.xx),则说明 CFST **测速时走了代理**,请先关闭代理软件后再测速。
|
||||
@@ -87,7 +88,7 @@ chmod +x cfst
|
||||
|
||||
****
|
||||
|
||||
> _在**手机**上独立运行 CFST 测速的简单教程:**[Android](https://github.com/XIU2/CloudflareSpeedTest/discussions/61)、[Android APP](https://github.com/xianshenglu/cloudflare-ip-tester-app)、[IOS](https://github.com/XIU2/CloudflareSpeedTest/discussions/321)**_
|
||||
> _在**手机**上独立运行 CFST 测速的简单教程:**[Android](https://github.com/XIU2/CloudflareSpeedTest/discussions/61)、[Android APP](https://github.com/Hsia97/CFSTAPP)、[Android APP](https://github.com/xianshenglu/cloudflare-ip-tester-app)、[IOS](https://github.com/XIU2/CloudflareSpeedTest/discussions/321)**_
|
||||
|
||||
> [!NOTE]
|
||||
> 注意!本软件仅适用于网站,**不支持给使用 UDP 协议的 Cloudflare WARP 优选 IP**,具体见:[#392](https://github.com/XIU2/CloudflareSpeedTest/discussions/392)
|
||||
@@ -137,15 +138,18 @@ IP 地址,已发送,已接收,丢包率,平均延迟,下载速度(MB/s),地区
|
||||
104.27.200.69,4,4,0.00,146.23,28.64,LAX
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> _如果你发现**下载速度为 0.00**,那么可以用**调试模式 `-debug`** 排查一下,详见:[**# 下载测速都是 0.00 ?**](https://github.com/XIU2/CloudflareSpeedTest#-%E4%B8%8B%E8%BD%BD%E6%B5%8B%E9%80%9F%E9%83%BD%E6%98%AF-000-)_
|
||||
|
||||
> _大家可以按自己需求,对完整结果**进一步筛选处理**,或者去看一看进阶使用**指定过滤条件**!_
|
||||
|
||||
****
|
||||
## \# 进阶使用
|
||||
|
||||
直接运行使用的是默认参数,如果想要测速结果更全面、更符合自己的要求,可以自定义参数。
|
||||
直接运行使用的是默认参数,如果想要**更好更高效的寻找最适合自己的** IP,那么就需要善用各个参数的搭配组合:
|
||||
|
||||
```Dart
|
||||
C:\>cfst.exe -h
|
||||
C:\>cfst -h
|
||||
|
||||
CloudflareSpeedTest vX.X.X
|
||||
测试各个 CDN 或网站所有 IP 的延迟和速度,获取最快 IP (IPv4+IPv6)!
|
||||
@@ -198,6 +202,7 @@ https://github.com/XIU2/CloudflareSpeedTest
|
||||
指定IP段数据;直接通过参数指定要测速的 IP 段数据,英文逗号分隔;(默认 空)
|
||||
-o result.csv
|
||||
写入结果文件;如路径含有空格请加上引号;值为空时不写入文件 [-o ""];(默认 result.csv)
|
||||
注意:在一些环境下使用 -o "" 可能会被忽略掉这个空参数导致报错,可加个空格 -o " " 解决
|
||||
|
||||
-dd
|
||||
禁用下载测速;禁用后测速结果会按延迟排序 (默认按下载速度排序);(默认 启用)
|
||||
@@ -208,7 +213,7 @@ https://github.com/XIU2/CloudflareSpeedTest
|
||||
调试输出模式;会在一些非预期情况下输出更多日志以便判断原因;(默认 关闭)
|
||||
目前该功能仅针对 HTTPing 延迟测速过程 及 下载测速过程,当过程中因为各种原因导致当前 IP 测速中断都会输出错误原因
|
||||
例如:HTTPing 延迟测速过程中,因为 HTTP 状态码不符合或测速地址有问题或超时等原因而终止测速
|
||||
例如:下载测速过程中,因为下载测速地址有问题(被阻断、403状态码、超时)等原因而终止测速
|
||||
例如:下载测速过程中,因为下载测速地址有问题(被阻断、403状态码、超时)等原因而终止测速(导致显示 0.00)
|
||||
|
||||
-v
|
||||
打印程序版本 + 检查版本更新
|
||||
@@ -280,7 +285,9 @@ CFST 会先延迟测速,在这过程中进度条右侧会实时显示可用 IP
|
||||
|
||||
****
|
||||
|
||||
另外,如果全部队列 IP 都测速完了,但一个满足下载速度条件的 IP 都没有,你可能需要调低预期的下载测速下限条件,但你需要知道当前的大概测速速度都在什么范围,那么你就可以加上 `-debug` 参数开启调试模式,这样再遇到这种情况时,就会**忽略条件返回所有测速数据**,你就能看到这些 IP 的下载速度都有多少,心里也就有数了,然后**适当调低 `-sl` 再试试**。
|
||||
另外,如果全部队列 IP 都测速完了,但一个满足下载速度条件的 IP 都没有,你可能需要调低预期的下载测速下限条件,但你需要知道当前的大概测速速度都在什么范围,那么你就可以加上 `-debug` 参数开启调试模式,这样再遇到这种情况时,就会**忽略条件返回所有测速结果**,你就能看到这些 IP 的下载速度都有多少,心里也就有数了,然后**适当调低 `-sl` 再试试**。
|
||||
|
||||
> 注意,如果你**没有指定**下载测速下限 `-sl` 条件,那么无论什么情况下 CFST 都会**输出所有测速结果**。
|
||||
|
||||
同样,延迟测速方面,`可用: 30`、`队列:10` 这两个数值也可以让你清楚,你设置的延迟条件对你来说是否过于苛刻。如果可用 IP 一大堆,但条件过滤后只剩下 2、3 个,那不用说就知道需要**调低预期的延迟/丢包条件**了。
|
||||
|
||||
@@ -295,9 +302,9 @@ CFST 会先延迟测速,在这过程中进度条右侧会实时显示可用 IP
|
||||
Windows 要指定参数需要在 CMD 中运行,或者把参数添加到快捷方式目标中。
|
||||
|
||||
> [!TIP]
|
||||
> - 各参数均有**默认值**,使用默认值的参数是可以省略的(**按需选择**),参数**不分前后顺序**。
|
||||
> - Windows **PowerShell** 只需把下面命令中的 `cfst.exe` 改为 `.\cfst.exe` 即可。
|
||||
> - Linux 系统只需要把下面命令中的 `cfst.exe` 改为 `./cfst` 即可。
|
||||
> - 各参数均有**默认值**,当使用默认值时参数可以省略(**按需选择**),参数**不分前后顺序**。
|
||||
> - Windows **PowerShell** 只需把下面命令中的 `cfst` 改为 `.\cfst` 即可。
|
||||
> - Linux / macOS 系统只需要把下面命令中的 `cfst` 改为 `./cfst` 即可。
|
||||
|
||||
****
|
||||
|
||||
@@ -310,22 +317,23 @@ Windows 要指定参数需要在 CMD 中运行,或者把参数添加到快捷
|
||||
|
||||
****
|
||||
|
||||
很多人打开 CMD 以**绝对路径**运行 CFST 会报错,这是因为默认的 `-f ip.txt` 参数是相对路径,需要指定绝对路径的 ip.txt 才行,但这样毕竟太麻烦了,因此还是建议进入 CFST 程序目录下,以**相对路径**方式运行:
|
||||
很多人打开 CMD 直接就以**绝对路径**运行 CFST 会报错,这是因为默认的 `-f ip.txt` 参数是相对路径,需要指定绝对路径的 ip.txt 才行,但这样毕竟太麻烦了,因此还是建议进入 CFST 程序目录下,以**相对路径**方式运行:
|
||||
|
||||
**方式 一**:
|
||||
1. 打开 CFST 程序所在目录
|
||||
2. 空白处按下 <kbd>Shift + 鼠标右键</kbd> 显示右键菜单
|
||||
3. 选择 **\[在此处打开命令窗口\]** 来打开 CMD 窗口,此时默认就位于当前目录下
|
||||
4. 输入带参数的命令,如:`cfst.exe -tll 50 -tl 200`即可运行
|
||||
4. 输入带参数的命令,如:`cfst -tl 200 -dn 20` 即可运行
|
||||
|
||||
**方式 二**:
|
||||
1. 打开 CFST 程序所在目录
|
||||
2. 直接在文件夹地址栏中全选并输入 `cmd` 回车来打开 CMD 窗口,此时默认就位于当前目录下
|
||||
4. 输入带参数的命令,如:`cfst.exe -tll 50 -tl 200`即可运行
|
||||
2. 直接在文件夹地址栏中全选(或清空)并输入 `cmd` 回车就能打开 CMD 窗口,此时默认就位于当前目录下
|
||||
4. 输入带参数的命令,如:`cfst -tl 200 -dn 20` 即可运行
|
||||
|
||||
> 当然你也可以随便打开一个 CMD 窗口,然后输入如 `cd /d "D:\Program Files\cfst"` 来进入程序目录
|
||||
|
||||
> **提示**:如果用的是 **PowerShell** 只需把命令中的 `cfst.exe` 改为 `.\cfst.exe` 即可。
|
||||
> **提示**:如果用的是 **PowerShell** 只需把命令中的 `cfst` 改为 `.\cfst` 即可。
|
||||
> **注意**:在 **PowerShell** 下使用 `-o ""` 会被忽略掉空参数导致报错,可加个空格 `-o " "` 解决
|
||||
|
||||
</details>
|
||||
|
||||
@@ -343,11 +351,11 @@ Windows 要指定参数需要在 CMD 中运行,或者把参数添加到快捷
|
||||
右键 `cfst.exe` 文件 - **\[创建快捷方式\]**,然后右键该快捷方式 - **\[属性\]**,修改其**目标**:
|
||||
|
||||
``` bash
|
||||
# 如果要不输出结果文件,那么请加上 -o " ",引号里的是空格(没有空格会导致该参数被省略)。
|
||||
D:\ABC\cfst\cfst.exe -n 500 -t 4 -dn 20 -dt 5 -o " "
|
||||
# 如果要不输出结果文件,那么请加上 -o " ",引号里的是空格(不加空格会导致该空参数被忽略从而报错)。
|
||||
D:\ABC\cfst\cfst.exe -tl 200 -dn 20 -o " "
|
||||
|
||||
# 如果文件路径包含引号,则需要把启动参数放在引号外面,记得引号和 - 之间有空格。
|
||||
"D:\Program Files\cfst\cfst.exe" -n 500 -t 4 -dn 20 -dt 5 -o " "
|
||||
"D:\Program Files\cfst\cfst.exe" -tl 200 -dn 20 -o " "
|
||||
|
||||
# 注意!快捷方式 - 起始位置 不能是空的,否则就会因为绝对路径而找不到 ip.txt 文件
|
||||
```
|
||||
@@ -364,14 +372,14 @@ D:\ABC\cfst\cfst.exe -n 500 -t 4 -dn 20 -dt 5 -o " "
|
||||
****
|
||||
``` bash
|
||||
# 指定自带的 IPv4 数据文件可测速这些 IPv4 地址(-f 默认值就是 ip.txt,所以该参数可省略)
|
||||
cfst.exe -f ip.txt
|
||||
cfst -f ip.txt
|
||||
|
||||
# 指定自带的 IPv6 数据文件可测速这些 IPv6 地址
|
||||
# 另外,v2.1.0 版本后支持 IPv4+IPv6 混合测速并移除了 -ipv6 参数,因此一个文件内可以同时包含 IPv4+IPv6 地址
|
||||
cfst.exe -f ipv6.txt
|
||||
cfst -f ipv6.txt
|
||||
|
||||
# 也可以直接通过参数指定要测速的 IP
|
||||
cfst.exe -ip 1.1.1.1,2606:4700::/32
|
||||
cfst -ip 1.1.1.1,2606:4700::/32
|
||||
```
|
||||
|
||||
> 测速 IPv6 时,可能会注意到每次测速数量都不一样,了解原因: [#120](https://github.com/XIU2/CloudflareSpeedTest/issues/120)
|
||||
@@ -401,18 +409,18 @@ HTTP 协议适用于快速测试某域名指向某 IP 时是否可以访问,
|
||||
|
||||
``` bash
|
||||
# 只需加上 -httping 参数即可切换到 HTTP 协议延迟测速模式
|
||||
cfst.exe -httping
|
||||
cfst -httping
|
||||
|
||||
# 软件会根据访问时网页返回的有效 HTTP 状态码来判断可用性(当然超时也算),默认对返回 200 301 302 这三个 HTTP 状态码的视为有效,可以手动指定认为有效的 HTTP 状态码,但只能指定一个(你需要提前确定测试地址正常情况下会返回哪个状态码)
|
||||
cfst.exe -httping -httping-code 200
|
||||
cfst -httping -httping-code 200
|
||||
|
||||
# 通过 -url 参数来指定 HTTPing 测试地址(可以是任意网页 URL,不局限于具体文件地址)
|
||||
cfst.exe -httping -url https://cf.xiu2.xyz/url
|
||||
cfst -httping -url https://cf.xiu2.xyz/url
|
||||
# 如果你要 HTTPing 测试其他网站/CDN,那么指定一个该网站/使用该 CDN 的地址(因为软件默认地址是 Cloudflare 的,只能用于测试 Cloudflare 的 IP)
|
||||
|
||||
# 注意:如果测速地址为 HTTP 协议,记得加上 -tp 80(这个参数会影响 延迟测速/下载测速 时使用的端口)
|
||||
# 同理,如果要测速 80 端口,那么也需要加上 -url 参数来指定一个 http:// 协议的地址才行(且该地址不会强制重定向至 HTTPS),如果是非 80 443 端口,那么需要确定该下载测速地址是否支持通过该端口访问。
|
||||
cfst.exe -httping -tp 80 -url http://cdn.cloudflare.steamstatic.com/steam/apps/5952/movie_max.webm
|
||||
cfst -httping -tp 80 -url http://cdn.cloudflare.steamstatic.com/steam/apps/5952/movie_max.webm
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -453,7 +461,7 @@ Cloudflare CDN 的节点 IP 是 Anycast IP,即每个 IP 对应的服务器节
|
||||
# 如果延迟测速后结果为 0,则说明没有找到任何一个(未超时可用的)指定地区的 IP。
|
||||
# 节点地区名为当地 IATA 机场地区码或国家/城市码,指定多个时用英文逗号分隔,v2.2.3 版本后支持小写
|
||||
|
||||
cfst.exe -httping -cfcolo HKG,KHH,NRT,LAX,SEA,SJC,FRA,MAD
|
||||
cfst -httping -cfcolo HKG,KHH,NRT,LAX,SEA,SJC,FRA,MAD
|
||||
|
||||
# 注意,该参数只有在 HTTPing 延迟测速模式下才可用(因为软件是通过 HTTP 链接中的响应头来获得该 IP 的实际地区码)
|
||||
|
||||
@@ -476,13 +484,13 @@ cfst.exe -httping -cfcolo HKG,KHH,NRT,LAX,SEA,SJC,FRA,MAD
|
||||
|
||||
``` bash
|
||||
# 指定 IPv4 数据文件,不显示结果直接退出,输出结果到文件(-p 值为 0)
|
||||
cfst.exe -f 1.txt -p 0 -dd
|
||||
cfst -f 1.txt -p 0 -dd
|
||||
|
||||
# 指定 IPv4 数据文件,不输出结果到文件,直接显示结果(-p 值为 10 条,-o 值为空但引号不能少)
|
||||
cfst.exe -f 2.txt -o "" -p 10 -dd
|
||||
cfst -f 2.txt -o "" -p 10 -dd
|
||||
|
||||
# 指定 IPv4 数据文件 及 输出结果到文件(相对路径,即当前目录下,如含空格请加上引号)
|
||||
cfst.exe -f 3.txt -o result.txt -dd
|
||||
cfst -f 3.txt -o result.txt -dd
|
||||
|
||||
|
||||
# 指定 IPv4 数据文件 及 输出结果到文件(相对路径,即当前目录内的 abc 文件夹下,如含空格请加上引号)
|
||||
@@ -490,7 +498,7 @@ cfst.exe -f 3.txt -o result.txt -dd
|
||||
./cfst -f abc/3.txt -o abc/result.txt -dd
|
||||
|
||||
# Windows(注意是反斜杠)
|
||||
cfst.exe -f abc\3.txt -o abc\result.txt -dd
|
||||
cfst -f abc\3.txt -o abc\result.txt -dd
|
||||
|
||||
|
||||
# 指定 IPv4 数据文件 及 输出结果到文件(绝对路径,即 C:\abc\ 目录下,如含空格请加上引号)
|
||||
@@ -498,7 +506,7 @@ cfst.exe -f abc\3.txt -o abc\result.txt -dd
|
||||
./cfst -f /abc/4.txt -o /abc/result.csv -dd
|
||||
|
||||
# Windows(注意是反斜杠)
|
||||
cfst.exe -f C:\abc\4.txt -o C:\abc\result.csv -dd
|
||||
cfst -f C:\abc\4.txt -o C:\abc\result.csv -dd
|
||||
|
||||
|
||||
# 如果要以【绝对路径】运行 CFST,那么 -f / -o 参数中的文件名也必须是【绝对路径】,否则会报错找不到文件!
|
||||
@@ -506,7 +514,7 @@ cfst.exe -f C:\abc\4.txt -o C:\abc\result.csv -dd
|
||||
/abc/cfst -f /abc/4.txt -o /abc/result.csv -dd
|
||||
|
||||
# Windows(注意是反斜杠)
|
||||
C:\abc\cfst.exe -f C:\abc\4.txt -o C:\abc\result.csv -dd
|
||||
C:\abc\cfst -f C:\abc\4.txt -o C:\abc\result.csv -dd
|
||||
```
|
||||
</details>
|
||||
|
||||
@@ -523,7 +531,7 @@ C:\abc\cfst.exe -f C:\abc\4.txt -o C:\abc\result.csv -dd
|
||||
# 如果你想要测速非默认 443 的其他端口,则需要通过 -tp 参数指定(该参数会影响 延迟测速/下载测速 时使用的端口)
|
||||
|
||||
# 如果要延迟测速 80 端口+下载测速(如果 -dd 禁用了下载测速则不需要),那么还需要指定 http:// 协议的下载测速地址才行(且该地址不会强制重定向至 HTTPS,因为那样就变成 443 端口了)
|
||||
cfst.exe -tp 80 -url http://cdn.cloudflare.steamstatic.com/steam/apps/5952/movie_max.webm
|
||||
cfst -tp 80 -url http://speed.cloudflare.com/__down?bytes=99999999
|
||||
|
||||
# 如果是非 80 443 的其他端口,那么需要确定你使用的下载测速地址是否支持通过该非标端口访问。
|
||||
```
|
||||
@@ -543,10 +551,10 @@ cfst.exe -tp 80 -url http://cdn.cloudflare.steamstatic.com/steam/apps/5952/movie
|
||||
# 该参数适用于下载测速 及 HTTP 协议的延迟测速,对于后者该地址可以是任意网页 URL(不局限于具体文件地址)
|
||||
|
||||
# 地址要求:可以直接下载、文件大小超过 200MB、用的是 Cloudflare CDN
|
||||
cfst.exe -url https://cf.xiu2.xyz/url
|
||||
cfst -url https://cf.xiu2.xyz/url
|
||||
|
||||
# 注意:如果测速地址为 HTTP 协议(该地址不能强制重定向至 HTTPS),记得加上 -tp 80(这个参数会影响 延迟测速/下载测速 时使用的端口),如果是非 80 443 端口,那么需要确定下载测速地址是否支持通过该端口访问。
|
||||
cfst.exe -tp 80 -url http://cdn.cloudflare.steamstatic.com/steam/apps/5952/movie_max.webm
|
||||
cfst -tp 80 -url http://speed.cloudflare.com/__down?bytes=99999999
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -567,27 +575,44 @@ cfst.exe -tp 80 -url http://cdn.cloudflare.steamstatic.com/steam/apps/5952/movie
|
||||
``` bash
|
||||
# 平均延迟上限:200 ms,下载速度下限:0 MB/s
|
||||
# 即找到平均延迟低于 200 ms 的 IP,然后再按延迟从低到高进行 10 次下载测速
|
||||
cfst.exe -tl 200
|
||||
cfst -tl 200
|
||||
```
|
||||
|
||||
> 如果**没有找到一个满足延迟**条件的 IP,那么不会输出任何内容。
|
||||
|
||||
****
|
||||
|
||||
- 仅指定 **[平均延迟上限]** 条件,且**只延迟测速,不下载测速**
|
||||
- 指定 **[平均延迟上限]** 条件,且**只延迟测速,不下载测速**
|
||||
|
||||
``` bash
|
||||
# 平均延迟上限:200 ms,下载速度下限:0 MB/s,数量:不知道多少 个
|
||||
# 即只输出低于 200ms 的 IP,且不再下载测速(因为不再下载测速,所以 -dn 参数就无效了)
|
||||
cfst.exe -tl 200 -dd
|
||||
cfst -tl 200 -dd
|
||||
```
|
||||
|
||||
****
|
||||
|
||||
- 同时指定 **[平均延迟下限] + [平均延迟上限]** 条件
|
||||
|
||||
``` bash
|
||||
# 平均延迟下限:60 ms,平均延迟下限:200 ms,下载速度下限:0 MB/s
|
||||
# 即找到平均延迟高于 60 ms 且低于 200 ms 的 IP(也就是 60~200ms 之间的),然后再按延迟从低到高进行 10 次下载测速
|
||||
cfst -tll 60 -tl 200
|
||||
```
|
||||
|
||||
> 可能很多纳闷延迟不是越低越好吗?为什么还要丢掉低延迟的 IP ?
|
||||
> - 一方面是:一些人确实存在个性化需求,需要指定延迟区间。
|
||||
> - 另一方面则是:**延迟和丢包最低的 IP 不一定就速度更快**(当然一般情况下延迟更低且不丢包是更好的,因为这意味着 **"物理距离近+中间路由环节少+网络稳定"**,因此显然这种网络质量遇到速度快的概率更高),但网络质量好就不一定速度更快,因为传输速度是可以被控制的(比如 QOS),因此也会出现一些明明延迟更高,但是速度反而更快的情况(仅限于延迟差异,如果还涉及到丢包,那么因为丢包对传输速度影响**极大**,也会导致这种情况)
|
||||
> - 比如国内移动用户默认参数测速结果基本上都是清一色的 几十ms 的香港节点 IP,但容易遇到延迟很低还不丢包,但就是速度很差,或者时快时慢的,很折磨人,此时改用其它地区的虽然延迟更高但可能反而速度更快,就可以使用 `-tll` 来过滤掉这些香港的(除此之外就只有 httping 模式下的 colo 参数可以过滤了)
|
||||
|
||||
****
|
||||
|
||||
- 仅指定 **[丢包几率上限]** 条件
|
||||
|
||||
``` bash
|
||||
# 丢包几率上限:0.25
|
||||
# 即找到丢包率低于等于 0.25 的 IP,范围 0.00~1.00,如果 -tlr 0 则代表过滤掉任何丢包的 IP
|
||||
cfst.exe -tlr 0.25
|
||||
cfst -tlr 0.25
|
||||
```
|
||||
|
||||
****
|
||||
@@ -597,13 +622,14 @@ cfst.exe -tlr 0.25
|
||||
``` bash
|
||||
# 平均延迟上限:9999 ms,下载速度下限:5 MB/s,数量:10 个(可选)
|
||||
# 即需要找到 10 个平均延迟低于 9999 ms 且下载速度高于 5 MB/s 的 IP 才会停止测速
|
||||
cfst.exe -sl 5 -dn 10
|
||||
cfst -sl 5 -dn 10
|
||||
```
|
||||
|
||||
> 如果**没有找到一个满足速度**条件的 IP,那么不会输出任何内容,你可能需要调低预期的下载测速下限条件,但你需要知道当前的大概测速速度都在什么范围,那么你就可以加上 `-debug` 参数开启调试模式,这样再遇到这种情况时,就会**忽略条件返回所有测速数据**,你就能看到这些 IP 的下载速度都有多少,心里也就有数了,然后**适当调低 `-sl` 再试试**。
|
||||
> 如果**没有找到一个满足速度**条件的 IP,那么不会输出任何内容,你可能需要调低预期的下载测速下限条件,但你需要知道当前的大概测速速度都在什么范围,那么你就可以加上 `-debug` 参数开启调试模式,这样再遇到这种情况时,就会**忽略条件返回所有测速结果**,你就能看到这些 IP 的下载速度都有多少,心里也就有数了,然后**适当调低 `-sl` 再试试**。
|
||||
> 注意,如果你**没有指定**下载测速下限 `-sl` 条件,那么无论什么情况下 CFST 都会**输出所有测速结果**。
|
||||
|
||||
> 没有指定平均延迟上限时,如果一直**凑不够**满足条件的 IP 数量,就会**一直测速**下去。
|
||||
> 所以建议**同时指定 [下载速度下限] + [平均延迟上限]**,这样测速到指定延迟上限还没凑够数量,就会终止测速。
|
||||
> 建议**同时指定 [下载速度下限] + [平均延迟上限]**,这样测速到指定延迟上限还没凑够数量,就会终止测速。
|
||||
|
||||
****
|
||||
|
||||
@@ -613,7 +639,7 @@ cfst.exe -sl 5 -dn 10
|
||||
# 平均延迟上限、下载速度下限均支持小数(如 -sl 0.5)
|
||||
# 平均延迟上限:200 ms,下载速度下限:5.6 MB/s,数量:10 个(可选)
|
||||
# 即需要找到 10 个平均延迟低于 200 ms 且下载速度高于 5 .6MB/s 的 IP 才会停止测速
|
||||
cfst.exe -tl 200 -sl 5.6 -dn 10
|
||||
cfst -tl 200 -sl 5.6 -dn 10
|
||||
```
|
||||
|
||||
> 如果**没有找到一个满足延迟**条件的 IP,那么不会输出任何内容。
|
||||
@@ -623,6 +649,33 @@ cfst.exe -tl 200 -sl 5.6 -dn 10
|
||||
> 因为 Cloudflare 公开的 IP 段是**回源 IP+任播 IP**,而**回源 IP**是无法使用的,所以下载测速是 0.00。
|
||||
> 运行时可以加上 `-sl 0.01`(下载速度下限),过滤掉**回源 IP**(下载测速低于 0.01MB/s 的结果)。
|
||||
|
||||
****
|
||||
|
||||
为了避免大家迷糊,我列出了在各种条件组合下的预期输出结果都是什么样的。
|
||||
|
||||
**没有指定任何 延迟/速度条件 (即都是默认值):**
|
||||
- 无论如何,都直接输出 **所有测速结果**
|
||||
|
||||
****
|
||||
|
||||
**指定了任何 延迟条件(`-tl` `-tll`,且无论是否开启调试模式 `-debug` 都一样):**
|
||||
- 如果找到最少 1 个满足条件的 IP,则只输出 **这几个满足条件的 IP**(如没有禁用下载测速,则会继续下载测速)
|
||||
- 如果没找到任何满足条件的 IP,则会输出 **空**(如没有禁用下载测速,也会因为数量为 0 而跳过下载测速)
|
||||
|
||||
****
|
||||
|
||||
**指定了任何 下载速度条件 (`-sl`):**
|
||||
|
||||
且当 **关闭 调试模式** 时(即没加上 `-debug` 参数,这种情况下和延迟测速的逻辑完全一致):
|
||||
|
||||
- 如果找到最少 1 个满足条件的 IP,则只输出 **这几个满足条件的 IP**
|
||||
- 如果没找到任何满足条件的 IP,则输出 **空**
|
||||
|
||||
且当 **开启 调试模式** 时(即加上了 `-debug` 参数,延迟测速并没有加上下面第二条里的逻辑,所以依然输出 空):
|
||||
|
||||
- 如果找到最少 1 个满足条件的 IP,则只输出 **这几个满足条件的 IP**
|
||||
- 如果没找到任何满足条件的 IP,则直接输出 **所有测速结果**
|
||||
|
||||
</details>
|
||||
|
||||
****
|
||||
@@ -639,7 +692,7 @@ cfst.exe -tl 200 -sl 5.6 -dn 10
|
||||
``` bash
|
||||
# 先进入 CFST 所在目录,然后运行:
|
||||
# Windows 系统(在 CMD 中运行)
|
||||
cfst.exe -ip 1.1.1.1,2.2.2.2/24,2606:4700::/32
|
||||
cfst -ip 1.1.1.1,2.2.2.2/24,2606:4700::/32
|
||||
|
||||
# Linux 系统
|
||||
./cfst -ip 1.1.1.1,2.2.2.2/24,2606:4700::/32
|
||||
@@ -666,7 +719,7 @@ cfst.exe -ip 1.1.1.1,2.2.2.2/24,2606:4700::/32
|
||||
``` bash
|
||||
# 先进入 CFST 所在目录,然后运行:
|
||||
# Windows 系统(在 CMD 中运行)
|
||||
cfst.exe -f 1.txt
|
||||
cfst -f 1.txt
|
||||
|
||||
# Linux 系统
|
||||
./cfst -f 1.txt
|
||||
@@ -684,31 +737,45 @@ cfst.exe -f 1.txt
|
||||
<summary><code><strong>「 点击展开 查看内容 」</strong></code></summary>
|
||||
|
||||
****
|
||||
**\#\# 原理简单解释:**
|
||||
|
||||
首先要明白,本软件的下载测速过程,本质上和你将 `IP 下载测速地址的域名` 写入 hosts 文件,然后浏览器去访问下载测速地址是一样的,只不过软件将其自动化了(类似于 `curl -I --resolve 下载测速地址的域名:443:IP https://下载测速地址`)。
|
||||
首先要明白,CFST 下载测速过程,本质上和你将 `IP 下载测速地址域名` 写入 hosts 文件,然后浏览器去访问下载测速地址是一样的,只不过软件将其自动化了(类似于 `curl -I --resolve 下载测速地址域名:443:IP https://下载测速地址`)。
|
||||
|
||||
因此如果下载测速结果全都是 0.00 MB/s,那么以为着下载测速失败,就只有这几种可能性。
|
||||
因此如果下载测速结果全都是 0.00 MB/s,那么代表**下载测速过程中出问题报错**,导致直接终止测速了(并最终显示为 0.00),就只有这几种可能性:
|
||||
|
||||
1. **下载测速地址有问题**
|
||||
2. **测速的 IP 地址有问题**
|
||||
3. **你的网络有问题**
|
||||
|
||||
但在排查具体是哪个问题前,可以先在你原先的 CFST 运行命令后追加一个 `-debug` 参数来开启调试模式,重新跑一边测速,这样下载过程中报错了就能直接看到下载测速失败的具体原因。
|
||||
****
|
||||
|
||||
常见的下载测速失败报错原因有(因为是原生报错信息,因此基本都是英文):
|
||||
**\#\# 调试模式排查:**
|
||||
|
||||
接下来**请务必**先在你原先使用的 CFST 运行命令后**追加一个 `-debug` 参数来开启调试模式**,重新跑一遍测速,这样下载测速过程中出现任何报错都会显示具体原因方便你排查。
|
||||
|
||||
常见的下载测速失败报错原因有(因为是 Go 语言的原生报错信息,因此基本都是英文):
|
||||
|
||||
1. `... read: connection reset by peer ... `
|
||||
下载测速地址被阻断了,可能是蔷干的,也可能是运营商干的(比如移动或部分地区的白名单)
|
||||
**链接被重置**,可能是下载测速地址被阻断了 或测速 IP 被针对性 HTTPS 阻断了,可能是蔷干的,也可能是运营商干的(比如移动或部分地区的白名单),当然也可能是测速 IP 服务器单纯的重置了你这个不合法的链接请求
|
||||
2. `... HTTP 状态码: 403 ...`
|
||||
像这种直接提示 HTTP 状态码的,比较好判断,如 403 就是测速地址禁止你访问,404 就是测速地址找不到文件,具体可以搜索 HTTP 状态码含义
|
||||
像这种直接提示 **HTTP 状态码**的,比较好判断,如 403 就是下载测速地址禁止你访问,404 就是下载测速地址路径对应的文件找不到(具体其他的可以搜索 HTTP 状态码含义)
|
||||
3. `... context deadline exceeded (Client.Timeout exceeded while awaiting headers) ...`
|
||||
这种一般是超时引起的,可能是 IP 等网络问题,也可能是 -dt 下载测速时间设置的太短了,当然默认的 10 秒到不至于超时
|
||||
这种一般是**请求超时**引起的,可能是 IP 或网络问题,也可能是 `-dt` 下载测速时间设置的太短了(当然默认的 10 秒肯定算不上短)
|
||||
4. `... tls: handshake failure ...` 或 `... tls: failed to verify certificate ...`
|
||||
这种 TLS 握手失败/TLS 证书错误 代表下载测速地址和测速 IP 服务器不匹配,也就是 下载测速地址 与 测速 IP 其中一方有误(例如下载测速地址是托管在 Fastly CDN 的,但测速 IP 是 Cloudflare CDN 的,或者反过来,总之就是 IP 服务器告诉你这个网站域名它不认识并把你拒之门外)
|
||||
这种 **TLS 握手失败/SSL 证书错误** 代表下载测速地址和测速 IP 服务器不匹配,也就是下载测速地址与测速 IP 其中一方有误(例如下载测速地址是托管在 Fastly CDN 的,但测速 IP 是 Cloudflare CDN 的,或者反过来,总之就是你访问下载测速地址时该测速的 IP 服务器告诉你这个网站域名它不认识并把你拒之门外)
|
||||
5. `... tls: failed to verify certificate: x509: certificate is valid for XXX.XX, not YYY.YY ...`
|
||||
这种是 **SSL 证书里没有包含你下载测速地址的域名**,要么是下载测速地址证书配置有问题,要么就是该测速服务器 IP 上并没有该下载测速地址域名对应的 SSL 证书,也就意味着这个服务器 IP 是不能用于该下载测速地址域名的(比如你用谷歌的服务器 IP 去下载测速百度的域名就会这样,或像上面 4 的原因一样)
|
||||
6. `... tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time ...`
|
||||
这种是 **SSL 证书过期了或者尚未到有效时间**,除了这个原因外,也可能是和上面 4、5 的原因一样(这 4、5、6 三种报错可能会同时出现在同一个服务器 IP 上)
|
||||
7. `... tls: failed to verify certificate: x509: certificate signed by unknown authority.`
|
||||
这种代表**系统证书配置有问题**,导致 TLS 握手时无法验证证书,目前只在 Termux 内遇到过(解决方法见:https://github.com/XIU2/CloudflareSpeedTest/discussions/61 帖子末尾)
|
||||
|
||||
> 如果你遇到了其他报错原因,且翻译后还是不懂,可以发 Issues 或 Discussions 询问。
|
||||
> 如果你遇到了其他报错原因,且翻译后还是不懂,可以发 Issues 或 Discussions 询问,我也会更新到这里。
|
||||
> 但注意,发 Issues 或 Discussions 询问时,请记得带上**调试模式下 CFST 输出的完整内容(或者完整截图)**。
|
||||
|
||||
根据上面的报错原因排查一遍后,如果还是无法解决,那么可以尝试下面这些:
|
||||
根据上面的报错原因排查一遍后,如果还是无法解决,那么可以尝试下面这些进一步排查:
|
||||
|
||||
****
|
||||
|
||||
**一、下载测速地址有问题**:
|
||||
|
||||
@@ -772,6 +839,9 @@ cfst.exe -f 1.txt
|
||||
|
||||
## 衍生项目
|
||||
|
||||
- _[https://github.com/Hsia97/CFSTAPP](https://github.com/Hsia97/CFSTAPP)_
|
||||
_**CFST 安卓版 APP [#638](https://github.com/XIU2/CloudflareSpeedTest/discussions/638)**_
|
||||
|
||||
- _https://github.com/xianshenglu/cloudflare-ip-tester-app_
|
||||
_**CFST 安卓版 APP [#202](https://github.com/XIU2/CloudflareSpeedTest/discussions/320)**_
|
||||
|
||||
@@ -781,6 +851,12 @@ _**CFST OpenWrt 路由器插件版 [#174](https://github.com/XIU2/CloudflareSpee
|
||||
- _https://github.com/immortalwrt-collections/openwrt-cdnspeedtest_
|
||||
_**CFST OpenWrt 原生编译版本 [#64](https://github.com/XIU2/CloudflareSpeedTest/discussions/64)**_
|
||||
|
||||
- _https://github.com/GuangYu-yu/CloudflareST-Rust_
|
||||
_**CFST Rust 版本**_
|
||||
|
||||
- _https://github.com/masgzy/CloudflareST_
|
||||
_**CFST 的分支衍生版本(依然是 Go)**_
|
||||
|
||||
- _https://github.com/hoseinnikkhah/CloudflareSpeedTest-English_
|
||||
_**English language version of CFST (Text language differences only) [#64](https://github.com/XIU2/CloudflareSpeedTest/issues/68)**_
|
||||
|
||||
@@ -792,8 +868,8 @@ _**English language version of CFST (Text language differences only) [#64](https
|
||||
|
||||
- _https://github.com/Spedoske/CloudflareScanner_
|
||||
|
||||
> _因为该项目已经很长时间没更新了,而我又产生了很多功能需求,所以我临时学了下 Go 语言就上手了(菜)..._
|
||||
> _本软件基于该项目制作,但**已添加大量功能及修复 BUG**,并根据大家的使用反馈积极添加、优化功能(闲)..._
|
||||
> _因为该项目已经很长时间没更新了,而我又产生了很多功能需求,所以我临时学了下 Go 语言就上手了 (菜)..._
|
||||
> _本软件基于该项目,但**已彻底重构并添加大量功能/修复BUG**,根据大家的使用反馈积极添加/优化功能 (闲)..._
|
||||
|
||||
****
|
||||
|
||||
|
||||
15
go.mod
15
go.mod
@@ -1,8 +1,17 @@
|
||||
module github.com/XIU2/CloudflareSpeedTest
|
||||
|
||||
go 1.14
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/VividCortex/ewma v1.1.1
|
||||
github.com/cheggaaa/pb/v3 v3.0.4
|
||||
github.com/VividCortex/ewma v1.2.0
|
||||
github.com/cheggaaa/pb/v3 v3.1.7
|
||||
github.com/fatih/color v1.18.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
golang.org/x/sys v0.30.0 // indirect
|
||||
)
|
||||
|
||||
35
go.sum
35
go.sum
@@ -1,17 +1,18 @@
|
||||
github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM=
|
||||
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
|
||||
github.com/cheggaaa/pb/v3 v3.0.4 h1:QZEPYOj2ix6d5oEg63fbHmpolrnNiwjUsk+h74Yt4bM=
|
||||
github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw=
|
||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10=
|
||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||
github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
|
||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU=
|
||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
|
||||
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
|
||||
github.com/cheggaaa/pb/v3 v3.1.7 h1:2FsIW307kt7A/rz/ZI2lvPO+v3wKazzE4K/0LtTWsOI=
|
||||
github.com/cheggaaa/pb/v3 v3.1.7/go.mod h1:/Ji89zfVPeC/u5j8ukD0MBPHt2bzTYp74lQ7KlgFWTQ=
|
||||
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
||||
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
|
||||
15
main.go
15
main.go
@@ -109,7 +109,7 @@ https://github.com/XIU2/CloudflareSpeedTest
|
||||
flag.Parse()
|
||||
|
||||
if task.MinSpeed > 0 && time.Duration(maxDelay)*time.Millisecond == utils.InputMaxDelay {
|
||||
fmt.Println("\033[33m[提示] 在使用 [-sl] 参数时,建议搭配 [-tl] 参数,以避免因凑不够 [-dn] 数量而一直测速...\033[0m")
|
||||
utils.Yellow.Println("[提示] 在使用 [-sl] 参数时,建议搭配 [-tl] 参数,以避免因凑不够 [-dn] 数量而一直测速...")
|
||||
}
|
||||
utils.InputMaxDelay = time.Duration(maxDelay) * time.Millisecond
|
||||
utils.InputMinDelay = time.Duration(minDelay) * time.Millisecond
|
||||
@@ -122,9 +122,9 @@ https://github.com/XIU2/CloudflareSpeedTest
|
||||
fmt.Println("检查版本更新中...")
|
||||
checkUpdate()
|
||||
if versionNew != "" {
|
||||
fmt.Printf("*** 发现新版本 [%s]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新! ***", versionNew)
|
||||
utils.Yellow.Printf("*** 发现新版本 [%s]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新! ***", versionNew)
|
||||
} else {
|
||||
fmt.Println("当前为最新版本 [" + version + "]!")
|
||||
utils.Green.Println("当前为最新版本 [" + version + "]!")
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
@@ -141,15 +141,12 @@ func main() {
|
||||
speedData := task.TestDownloadSpeed(pingData)
|
||||
utils.ExportCsv(speedData) // 输出文件
|
||||
speedData.Print() // 打印结果
|
||||
|
||||
if versionNew != "" {
|
||||
fmt.Printf("\n*** 发现新版本 [%s]!请前往 [https://github.com/XIU2/CloudflareSpeedTest] 更新! ***\n", versionNew)
|
||||
}
|
||||
endPrint()
|
||||
endPrint() // 根据情况选择退出方式(针对 Windows)
|
||||
}
|
||||
|
||||
// 根据情况选择退出方式(针对 Windows)
|
||||
func endPrint() {
|
||||
if utils.NoPrintResult() {
|
||||
if utils.NoPrintResult() { // 如果不需要打印测速结果,则直接退出
|
||||
return
|
||||
}
|
||||
if runtime.GOOS == "windows" { // 如果是 Windows 系统,则需要按下 回车键 或 Ctrl+C 退出(避免通过双击运行时,测速完毕后直接关闭)
|
||||
|
||||
@@ -29,7 +29,10 @@
|
||||
|
||||
****
|
||||
|
||||
#### 2021年12月17日,版本 v1.0.6
|
||||
#### 2025年12月15日,版本 v1.0.5 (cfst_hosts.bat)
|
||||
- **1. 修复** CFST新版本下获取不到第一行 IP 的问题
|
||||
|
||||
#### 2021年12月17日,版本 v1.0.4
|
||||
- **1. 优化** [找不到满足条件的 IP 就一直循环测速] 功能,在指定下载测速下限时没有重新测速的问题(默认注释)
|
||||
|
||||
#### 2021年12月17日,版本 v1.0.3
|
||||
@@ -62,6 +65,9 @@
|
||||
|
||||
****
|
||||
|
||||
#### 2025年12月15日,版本 v1.0.6
|
||||
- **1. 修复** CFST新版本下获取不到第一行 IP 的问题
|
||||
|
||||
#### 2021年12月17日,版本 v1.0.5
|
||||
- **1. 优化** [找不到满足条件的 IP 就一直循环测速] 功能,在指定下载测速下限时没有重新测速的问题(默认注释)
|
||||
|
||||
@@ -118,6 +124,9 @@
|
||||
|
||||
****
|
||||
|
||||
#### 2025年12月15日,版本 v1.0.6 (cfst_ddns.bat)
|
||||
- **1. 修复** CFST新版本下获取不到第一行 IP 的问题
|
||||
|
||||
#### 2024年10月06日,版本 v1.0.5
|
||||
- **1. 新增** 支持 API 令牌方式(相比 API 密钥这种全局权限的,API 令牌可以自由控制权限)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
:: --------------------------------------------------------------
|
||||
:: 项目: CloudflareSpeedTest 自动更新 3Proxy
|
||||
:: 版本: 1.0.5
|
||||
:: 版本: 1.0.6
|
||||
:: 作者: XIU2
|
||||
:: 项目: https://github.com/XIU2/CloudflareSpeedTest
|
||||
:: --------------------------------------------------------------
|
||||
@@ -67,13 +67,11 @@ if not exist result_3proxy.txt (
|
||||
)
|
||||
|
||||
:: 获取第一行的最快 IP
|
||||
for /f "tokens=1 delims=," %%i in (result_3proxy.txt) do (
|
||||
set /a n+=1
|
||||
If !n!==2 (
|
||||
set bestip=%%i
|
||||
for /f "skip=1 tokens=1 delims=," %%i in ('more result_3proxy.txt') do (
|
||||
SET bestip=%%i
|
||||
goto :END
|
||||
)
|
||||
)
|
||||
|
||||
:END
|
||||
|
||||
:: 判断刚刚获取的最快 IP 是否为空,以及是否和旧 IP 一样
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
:: --------------------------------------------------------------
|
||||
:: 项目: CloudflareSpeedTest 自动更新域名解析记录
|
||||
:: 版本: 1.0.5
|
||||
:: 版本: 1.0.6
|
||||
:: 作者: XIU2
|
||||
:: 项目: https://github.com/XIU2/CloudflareSpeedTest
|
||||
:: --------------------------------------------------------------
|
||||
@@ -17,9 +17,7 @@ if not exist result_ddns.txt (
|
||||
goto :END
|
||||
)
|
||||
|
||||
for /f "tokens=1 delims=," %%i in (result_ddns.txt) do (
|
||||
Set /a n+=1
|
||||
If !n!==2 (
|
||||
for /f "skip=1 tokens=1 delims=," %%i in (result_ddns.txt) do (
|
||||
Echo %%i
|
||||
if "%%i"=="" (
|
||||
echo.
|
||||
@@ -40,6 +38,5 @@ for /f "tokens=1 delims=," %%i in (result_ddns.txt) do (
|
||||
|
||||
goto :END
|
||||
)
|
||||
)
|
||||
:END
|
||||
pause
|
||||
@@ -1,6 +1,6 @@
|
||||
:: --------------------------------------------------------------
|
||||
:: 项目: CloudflareSpeedTest 自动更新 Hosts
|
||||
:: 版本: 1.0.4
|
||||
:: 版本: 1.0.5
|
||||
:: 作者: XIU2
|
||||
:: 项目: https://github.com/XIU2/CloudflareSpeedTest
|
||||
:: --------------------------------------------------------------
|
||||
@@ -67,13 +67,11 @@ if not exist result_hosts.txt (
|
||||
)
|
||||
|
||||
:: 获取第一行的最快 IP
|
||||
for /f "tokens=1 delims=," %%i in (result_hosts.txt) do (
|
||||
SET /a n+=1
|
||||
If !n!==2 (
|
||||
for /f "skip=1 tokens=1 delims=," %%i in ('more result_hosts.txt') do (
|
||||
SET bestip=%%i
|
||||
goto :END
|
||||
)
|
||||
)
|
||||
|
||||
:END
|
||||
|
||||
:: 判断刚刚获取的最快 IP 是否为空,以及是否和旧 IP 一样
|
||||
|
||||
@@ -54,18 +54,18 @@ func TestDownloadSpeed(ipSet utils.PingDelaySet) (speedSet utils.DownloadSpeedSe
|
||||
return utils.DownloadSpeedSet(ipSet)
|
||||
}
|
||||
if len(ipSet) <= 0 { // IP 数组长度(IP数量) 大于 0 时才会继续下载测速
|
||||
fmt.Println("\n\033[33m[信息] 延迟测速结果 IP 数量为 0,跳过下载测速。\033[0m")
|
||||
utils.Yellow.Println("[信息] 延迟测速结果 IP 数量为 0,跳过下载测速。")
|
||||
return
|
||||
}
|
||||
testNum := TestCount
|
||||
if len(ipSet) < TestCount || MinSpeed > 0 { // 如果IP数组长度(IP数量) 小于下载测速数量(-dn),则次数修正为IP数
|
||||
testNum := TestCount // 等待下载测速的队列数量 先默认等于 下载测速数量(-dn)
|
||||
if len(ipSet) < TestCount || MinSpeed > 0 { // 如果延迟测速并过滤后的 IP 数组长度(IP数量) 小于 下载测速数量(-dn),(即 -dn 预期数量是不够的),或者指定了 下载测速下限 (-sl) 条件(这就可能要全部下载测速一遍,直到找齐预期数量或测完为止),则 等待下载测速的队列数量 修正为 IP 数量
|
||||
testNum = len(ipSet)
|
||||
}
|
||||
if testNum < TestCount {
|
||||
if testNum < TestCount { // 如果 等待下载测速的队列数量 小于 下载测速数量(-dn),(显然 -dn 预期数量是不够的),所以 下载测速数量(-dn)修正为 等待下载测速的队列数量
|
||||
TestCount = testNum
|
||||
}
|
||||
|
||||
fmt.Printf("\033[34m开始下载测速(下限:%.2f MB/s, 数量:%d, 队列:%d)\033[0m\n", MinSpeed, TestCount, testNum)
|
||||
utils.Cyan.Printf("开始下载测速(下限:%.2f MB/s, 数量:%d, 队列:%d)\n", MinSpeed, TestCount, testNum)
|
||||
// 控制 下载测速进度条 与 延迟测速进度条 长度一致(强迫症)
|
||||
bar_a := len(strconv.Itoa(len(ipSet)))
|
||||
bar_b := " "
|
||||
@@ -89,8 +89,10 @@ func TestDownloadSpeed(ipSet utils.PingDelaySet) (speedSet utils.DownloadSpeedSe
|
||||
}
|
||||
}
|
||||
bar.Done()
|
||||
if utils.Debug && len(speedSet) == 0 { // 调试模式下,没有满足速度限制的数据,返回所有测速数据供用户查看当前的测速结果,以便适当调低预期测速条件
|
||||
fmt.Println("\033[33m[调试] 没有满足 下载速度下限 条件的 IP,忽略条件返回所有测速数据(方便下次测速时调整条件)。\033[0m")
|
||||
if MinSpeed == 0.00 { // 如果没有指定下载速度下限,则直接返回所有测速数据
|
||||
speedSet = utils.DownloadSpeedSet(ipSet)
|
||||
} else if utils.Debug && len(speedSet) == 0 { // 如果指定了下载速度下限,且是调试模式下,且没有找到任何一个满足条件的 IP 时,返回所有测速数据,供用户查看当前的测速结果,以便适当调低预期测速条件
|
||||
utils.Yellow.Println("[调试] 没有满足 下载速度下限 条件的 IP,忽略条件返回所有测速数据(方便下次测速时调整条件)。")
|
||||
speedSet = utils.DownloadSpeedSet(ipSet)
|
||||
}
|
||||
// 按速度排序
|
||||
@@ -120,15 +122,15 @@ func printDownloadDebugInfo(ip *net.IPAddr, err error, statusCode int, url, last
|
||||
}
|
||||
if url != finalURL { // 如果 URL 和最终地址不一致,说明有重定向,是该重定向后的地址引起的错误
|
||||
if statusCode > 0 { // 如果状态码大于 0,说明是后续 HTTP 状态码引起的错误
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 下载测速终止,HTTP 状态码: %d, 下载测速地址: %s, 出错的重定向后地址: %s\033[0m\n", ip.String(), statusCode, url, finalURL)
|
||||
utils.Red.Printf("[调试] IP: %s, 下载测速终止,HTTP 状态码: %d, 下载测速地址: %s, 出错的重定向后地址: %s\n", ip.String(), statusCode, url, finalURL)
|
||||
} else {
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 下载测速失败,错误信息: %v, 下载测速地址: %s, 出错的重定向后地址: %s\033[0m\n", ip.String(), err, url, finalURL)
|
||||
utils.Red.Printf("[调试] IP: %s, 下载测速失败,错误信息: %v, 下载测速地址: %s, 出错的重定向后地址: %s\n", ip.String(), err, url, finalURL)
|
||||
}
|
||||
} else { // 如果 URL 和最终地址一致,说明没有重定向
|
||||
if statusCode > 0 { // 如果状态码大于 0,说明是后续 HTTP 状态码引起的错误
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 下载测速终止,HTTP 状态码: %d, 下载测速地址: %s\033[0m\n", ip.String(), statusCode, url)
|
||||
utils.Red.Printf("[调试] IP: %s, 下载测速终止,HTTP 状态码: %d, 下载测速地址: %s\n", ip.String(), statusCode, url)
|
||||
} else {
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 下载测速失败,错误信息: %v, 下载测速地址: %s\033[0m\n", ip.String(), err, url)
|
||||
utils.Red.Printf("[调试] IP: %s, 下载测速失败,错误信息: %v, 下载测速地址: %s\n", ip.String(), err, url)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -143,7 +145,7 @@ func downloadHandler(ip *net.IPAddr) (float64, string) {
|
||||
lastRedirectURL = req.URL.String() // 记录每次重定向的目标,以便在访问错误时输出
|
||||
if len(via) > 10 { // 限制最多重定向 10 次
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 下载测速地址重定向次数过多,终止测速,下载测速地址: %s\033[0m\n", ip.String(), req.URL.String())
|
||||
utils.Red.Printf("[调试] IP: %s, 下载测速地址重定向次数过多,终止测速,下载测速地址: %s\n", ip.String(), req.URL.String())
|
||||
}
|
||||
return http.ErrUseLastResponse
|
||||
}
|
||||
@@ -156,7 +158,7 @@ func downloadHandler(ip *net.IPAddr) (float64, string) {
|
||||
req, err := http.NewRequest("GET", URL, nil)
|
||||
if err != nil {
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 下载测速请求创建失败,错误信息: %v, 下载测速地址: %s\033[0m\n", ip.String(), err, URL)
|
||||
utils.Red.Printf("[调试] IP: %s, 下载测速请求创建失败,错误信息: %v, 下载测速地址: %s\n", ip.String(), err, URL)
|
||||
}
|
||||
return 0.0, ""
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package task
|
||||
|
||||
import (
|
||||
//"crypto/tls"
|
||||
"fmt"
|
||||
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
@@ -44,7 +44,7 @@ func (p *Ping) httping(ip *net.IPAddr) (int, time.Duration, string) {
|
||||
request, err := http.NewRequest(http.MethodHead, URL, nil)
|
||||
if err != nil {
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 延迟测速请求创建失败,错误信息: %v, 测速地址: %s\033[0m\n", ip.String(), err, URL)
|
||||
utils.Red.Printf("[调试] IP: %s, 延迟测速请求创建失败,错误信息: %v, 测速地址: %s\n", ip.String(), err, URL)
|
||||
}
|
||||
return 0, 0, ""
|
||||
}
|
||||
@@ -52,7 +52,7 @@ func (p *Ping) httping(ip *net.IPAddr) (int, time.Duration, string) {
|
||||
response, err := hc.Do(request)
|
||||
if err != nil {
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 延迟测速失败,错误信息: %v, 测速地址: %s\033[0m\n", ip.String(), err, URL)
|
||||
utils.Red.Printf("[调试] IP: %s, 延迟测速失败,错误信息: %v, 测速地址: %s\n", ip.String(), err, URL)
|
||||
}
|
||||
return 0, 0, ""
|
||||
}
|
||||
@@ -63,14 +63,14 @@ func (p *Ping) httping(ip *net.IPAddr) (int, time.Duration, string) {
|
||||
if HttpingStatusCode == 0 || HttpingStatusCode < 100 && HttpingStatusCode > 599 {
|
||||
if response.StatusCode != 200 && response.StatusCode != 301 && response.StatusCode != 302 {
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 延迟测速终止,HTTP 状态码: %d, 测速地址: %s\033[0m\n", ip.String(), response.StatusCode, URL)
|
||||
utils.Red.Printf("[调试] IP: %s, 延迟测速终止,HTTP 状态码: %d, 测速地址: %s\n", ip.String(), response.StatusCode, URL)
|
||||
}
|
||||
return 0, 0, ""
|
||||
}
|
||||
} else {
|
||||
if response.StatusCode != HttpingStatusCode {
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 延迟测速终止,HTTP 状态码: %d, 指定的 HTTP 状态码 %d, 测速地址: %s\033[0m\n", ip.String(), response.StatusCode, HttpingStatusCode, URL)
|
||||
utils.Red.Printf("[调试] IP: %s, 延迟测速终止,HTTP 状态码: %d, 指定的 HTTP 状态码 %d, 测速地址: %s\n", ip.String(), response.StatusCode, HttpingStatusCode, URL)
|
||||
}
|
||||
return 0, 0, ""
|
||||
}
|
||||
@@ -87,7 +87,7 @@ func (p *Ping) httping(ip *net.IPAddr) (int, time.Duration, string) {
|
||||
colo = p.filterColo(colo)
|
||||
if colo == "" { // 没有匹配到地区码或不符合指定地区则直接结束该 IP 测试
|
||||
if utils.Debug { // 调试模式下,输出更多信息
|
||||
fmt.Printf("\033[31m[调试] IP: %s, 地区码不匹配: %s\033[0m\n", ip.String(), colo)
|
||||
utils.Red.Printf("[调试] IP: %s, 地区码不匹配: %s\n", ip.String(), colo)
|
||||
}
|
||||
return 0, 0, ""
|
||||
}
|
||||
|
||||
@@ -64,9 +64,9 @@ func (p *Ping) Run() utils.PingDelaySet {
|
||||
return p.csv
|
||||
}
|
||||
if Httping {
|
||||
fmt.Printf("\033[34m开始延迟测速(模式:HTTP, 端口:%d, 范围:%v ~ %v ms, 丢包:%.2f)\033[0m\n", TCPPort, utils.InputMinDelay.Milliseconds(), utils.InputMaxDelay.Milliseconds(), utils.InputMaxLossRate)
|
||||
utils.Cyan.Printf("开始延迟测速(模式:HTTP, 端口:%d, 范围:%v ~ %v ms, 丢包:%.2f)\n", TCPPort, utils.InputMinDelay.Milliseconds(), utils.InputMaxDelay.Milliseconds(), utils.InputMaxLossRate)
|
||||
} else {
|
||||
fmt.Printf("\033[34m开始延迟测速(模式:TCP, 端口:%d, 范围:%v ~ %v ms, 丢包:%.2f)\033[0m\n", TCPPort, utils.InputMinDelay.Milliseconds(), utils.InputMaxDelay.Milliseconds(), utils.InputMaxLossRate)
|
||||
utils.Cyan.Printf("开始延迟测速(模式:TCP, 端口:%d, 范围:%v ~ %v ms, 丢包:%.2f)\n", TCPPort, utils.InputMinDelay.Milliseconds(), utils.InputMaxDelay.Milliseconds(), utils.InputMaxLossRate)
|
||||
}
|
||||
for _, ip := range p.ips {
|
||||
p.wg.Add(1)
|
||||
|
||||
16
utils/color.go
Normal file
16
utils/color.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/fatih/color"
|
||||
)
|
||||
|
||||
// 由专业的库来处理多平台的颜色输出效果
|
||||
var (
|
||||
Red = color.New(color.FgRed) // 红色 31
|
||||
Green = color.New(color.FgGreen) // 绿色 32
|
||||
Yellow = color.New(color.FgYellow) // 黄色 33
|
||||
Blue = color.New(color.FgBlue, color.Bold) // 蓝色 34
|
||||
Magenta = color.New(color.FgMagenta) // 紫红色 35
|
||||
Cyan = color.New(color.FgHiCyan, color.Bold) // 青色 36
|
||||
White = color.New(color.FgWhite) // 白色 37
|
||||
)
|
||||
@@ -176,16 +176,16 @@ func (s DownloadSpeedSet) Print() {
|
||||
if len(dateString) < PrintNum { // 如果IP数组长度(IP数量) 小于 打印次数,则次数改为IP数量
|
||||
PrintNum = len(dateString)
|
||||
}
|
||||
headFormat := "\033[34m%-16s%-5s%-5s%-5s%-6s%-12s%-5s\033[0m\n"
|
||||
headFormat := "%-16s%-5s%-5s%-5s%-6s%-12s%-5s\n"
|
||||
dataFormat := "%-18s%-8s%-8s%-8s%-10s%-16s%-8s\n"
|
||||
for i := 0; i < PrintNum; i++ { // 如果要输出的 IP 中包含 IPv6,那么就需要调整一下间隔
|
||||
if len(dateString[i][0]) > 15 {
|
||||
headFormat = "\033[34m%-40s%-5s%-5s%-5s%-6s%-12s%-5s\033[0m\n"
|
||||
headFormat = "%-40s%-5s%-5s%-5s%-6s%-12s%-5s\n"
|
||||
dataFormat = "%-42s%-8s%-8s%-8s%-10s%-16s%-8s\n"
|
||||
break
|
||||
}
|
||||
}
|
||||
fmt.Printf(headFormat, "IP 地址", "已发送", "已接收", "丢包率", "平均延迟", "下载速度(MB/s)", "地区码")
|
||||
Cyan.Printf(headFormat, "IP 地址", "已发送", "已接收", "丢包率", "平均延迟", "下载速度(MB/s)", "地区码")
|
||||
for i := 0; i < PrintNum; i++ {
|
||||
fmt.Printf(dataFormat, dateString[i][0], dateString[i][1], dateString[i][2], dateString[i][3], dateString[i][4], dateString[i][5], dateString[i][6])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user