Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

能否在每次测速的时候将当前IP一同测速并比较,这样可以防止定时运行时选出来的新IP速度比原IP还慢的情况发生。 #204

Open
wangkeair opened this issue May 6, 2022 · 13 comments

Comments

@wangkeair
Copy link

No description provided.

@XIU2
Copy link
Owner

XIU2 commented May 6, 2022

这些可以依靠第三方脚本实现的功能,是不会将其集成到软件自身的。

可以测试获得新 IP 后,将新旧两个 IP 写入到一个 txt 文件中,然后指定该文件 -f x.txt 再次测速对比一下,从中取出最快的。

对现有脚本稍微改改就能实现该效果。

@wangkeair
Copy link
Author

wangkeair commented May 6, 2022

小白对脚本一窍不通,比如整合到大佬的自动修改hosts的脚本里呢?

@XIU2
Copy link
Owner

XIU2 commented May 6, 2022

右键编辑 cfst_hosts.bat 脚本文件,找到末尾的这段代码。

echo %bestip%>nowip_hosts.txt
echo.
echo 旧 IP 为 %nowip%
echo 新 IP 为 %bestip%

在上面这段代码的前面插入以下代码:

echo %nowip%>hosts1.txt
echo %bestip%>>hosts1.txt

:: 删除旧测速结果文件,方便后续判断
del /f result_hosts1.txt


:: 这里可以自己添加、修改 CloudflareST 的运行参数,echo.| 的作用是自动回车退出程序(不再需要加上 -p 0 参数了)
echo.|CloudflareST.exe -o "result_hosts.txt" -f "hosts1.txt"


:: 判断结果文件是否存在,如果不存在说明结果为 0
if not exist result_hosts.txt (
    echo.
    echo CloudflareST 测速结果 IP 数量为 0,跳过下面步骤...
    goto :STOP
)

:: 获取第一行的最快 IP
set /a n=0
for /f "tokens=1 delims=," %%i in (result_hosts.txt) do (
    SET /a n+=1 
    If !n!==2 (
        SET bestip=%%i
        goto :END1
    )
)

if "%bestip%"=="%nowip%" (
    echo.
    echo 新 IP 不如旧 IP,终止后续的替换步骤...
    goto :STOP
)
:END1

这样运行脚本时,会在首次测速完成后,将新、旧 IP 写入 hosts1.txt 文件,然后对这两个 IP 进行测速,分出胜负得到最快的 IP,如果这个最快 IP 依然还是旧 IP,那么会直接终止后续替换步骤。

@wangkeair
Copy link
Author

感谢大佬细致指导!

@donzell888
Copy link

感谢大佬提供思路和代码。使用过程中发现两处小细节,简单处理了下(删除了-dd 参数,对变量n进行初始化)

右键编辑 cfst_hosts.bat 脚本文件,找到末尾的这段代码。

echo %bestip%>nowip_hosts.txt
echo.
echo 旧 IP 为 %nowip%
echo 新 IP 为 %bestip%

在上面这段代码的前面插入以下代码:

echo %nowip%>hosts1.txt
echo %bestip%>>hosts1.txt

:: 这里可以自己添加、修改 CloudflareST 的运行参数,echo.| 的作用是自动回车退出程序(不再需要加上 -p 0 参数了)
:: 删除-dd参数,启用下载测速,不然只会选择延迟低的
echo.|CloudflareST.exe -o "result_hosts.txt" -f "hosts1.txt"


:: 判断结果文件是否存在,如果不存在说明结果为 0
if not exist result_hosts.txt (
    echo.
    echo CloudflareST 测速结果 IP 数量为 0,跳过下面步骤...
    goto :STOP
)

:: 获取第一行的最快 IP

:: 初始化下,防止脚本里同名变量污染无法进行优选。
set /a n=0
for /f "tokens=1 delims=," %%i in (result_hosts.txt) do (
    SET /a n+=1 
    If !n!==2 (
        SET bestip=%%i
        goto :END1
    )
)
:END1

这样运行脚本时,会在首次测速完成后,将新、旧 IP 写入 hosts1.txt 文件,然后对这两个 IP 进行测速,得到最快的 IP。

@dqyhonghu
Copy link

大佬能弄个openwrt能用的shell脚本吗?

@XIU2
Copy link
Owner

XIU2 commented Jan 5, 2023

@dqyhonghu
编辑 cfst_hosts.sh 脚本文件,找到末尾的这段代码。

	echo ${BESTIP} > nowip_hosts.txt
	echo -e "\n旧 IP 为 ${NOWIP}\n新 IP 为 ${BESTIP}\n"

在上面这段代码的前面插入以下代码:

	# 将旧 IP 与新 IP 都写入文件用来测速
	echo -e "${NOWIP}\n${BESTIP}" > hosts1.txt
	# 删除结果文件,方便后续判断
	rm -f "result_hosts1.txt"

	# 这里可以自己添加、修改 CloudflareST 的运行参数
	./CloudflareST -f "hosts1.txt" -o "result_hosts1.txt"

	[[ ! -e "result_hosts1.txt" ]] && echo "新旧 IP 对比无结果,跳过下面步骤..." && exit 0

	# 获取最快 IP
	BESTIP=$(sed -n "2,1p" result_hosts1.txt | awk -F, '{print $1}')
	[[ -z "${BESTIP}" ]] && echo "新旧 IP 对比无结果,跳过下面步骤..." && exit 0
	[[ "${BESTIP}" == "${NOWIP}" ]] && echo "新 IP 不如旧 IP,终止后续的替换步骤..." && exit 0

这样运行脚本时,会在首次测速完成后,将新、旧 IP 写入 hosts1.txt 文件,然后对这两个 IP 进行测速,分出胜负得到最快的 IP,如果这个最快 IP 依然还是旧 IP,那么会直接终止后续替换步骤。

@dqyhonghu
Copy link

dqyhonghu commented Jan 9, 2023

谢谢大佬!试了一下,出现很奇怪的问题:
按以上代码修改cfst_hosts.sh后,每次执行都出现以下提示:

# XIU2/CloudflareSpeedTest v2.1.0

开始延迟测速(模式:TCP,端口:443,平均延迟上限:200 ms,平均延迟下限:40 ms)
2 / 2 [----------------------------------------------------------------] 100.00%
[信息] 延迟测速结果 IP 数量为 0,跳过下载测速。

[信息] 完整测速结果 IP 数量为 0,跳过输出结果。
新旧 IP 对比无结果,跳过下面步骤...

文件夹中也没有生成 result_hosts1.txt 文件 ,就好像 ./CloudflareST -f "hosts1.txt" -o "result_hosts1.txt" 这条加上的命令执行不正确,但是我单独执行这行命令,却可以得到比对结果并生成 result_hosts1.txt

@XIU2
Copy link
Owner

XIU2 commented Jan 9, 2023

@dqyhonghu 你改一下上面代码里的两个 新旧 IP 对比无结果,跳过下面步骤... 文字,来区分一下到底是因为哪个而退出的。

@dqyhonghu
Copy link

谢谢大佬及时和耐心的解答,今天分别增加了标记“01”和“02”,但脚本运行却正常了,并没有出现昨天的情况,还是没找到昨天遇到现象的具体原因,只能等以后看还会不会再次出现 !

@dqyhonghu
Copy link

今天又遇到了,是前面的那一行

@dqyhonghu 你改一下上面代码里的两个 新旧 IP 对比无结果,跳过下面步骤... 文字,来区分一下到底是因为哪个而退出的。

@XIU2
Copy link
Owner

XIU2 commented Jan 15, 2023

@dqyhonghu 前者的话,代表 CloudflareST 测速后没有生成结果文件。
而只有在这两种情况下不会生成结果文件:

  1. 软件运行报错意外终止,或手动终止
  2. 延迟测速均超时,或不满足测速条件(例如延迟上限)

如果是报错的话,你是可以看到的(或者说 CMD 窗口会直接关闭),是不会像上面你发的那样,正确输出完整信息的。
所以显然是后者,因此需要你手动运行脚本里写的 CloudflareST 命令来测试。

注意,你前面写的输出结果里是指定了条件的:... 平均延迟上限:200 ms,平均延迟下限:40 ms). ..
但你后面说的内容却不一样,显然并没有指定条件:

就好像 ./CloudflareST -f "hosts1.txt" -o "result_hosts1.txt" 这条加上的命令执行不正确,但是我单独执行这行命令,却可以得到比对结果并生成 result_hosts1.txt

@dqyhonghu
Copy link

@XIU2 明白了,谢谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants