CloudflareSpeedTest icon indicating copy to clipboard operation
CloudflareSpeedTest copied to clipboard

http模式下,检测到可用ip超过10就跳过后续未完成的检测延迟,直接进入下载测速阶段节省时间

Open 1265578519 opened this issue 2 years ago • 7 comments

功能需求

http模式下,检测到可用ip超过10就跳过后续未完成的检测延迟,直接进入下载测速阶段节省时间

预期目标

1

1265578519 avatar May 26 '23 16:05 1265578519

这个的话,我不确定是否为大众需求(就是不少人会需要的功能)。

一般什么情况下会产生该需求?请举几个例子。 毕竟一般来说,大家都是希望延迟测速所有 IP 后,排序得到延迟最低的 IP,再去下载测速或直接使用。而如果只需要 10 个可用的话,那么代表你不在乎可用 IP 的延迟/丢包,或者说你预先知道了这些可用 IP 的延迟/丢包情况都差不多,因此也不挑。

如果没什么人会用到的话,我可能会懒得去添加。。。对该功能感兴趣的其他人也可以在下面回复或给本条回复点表情,我看看有没有其他人需要该功能的。

XIU2 avatar May 27 '23 05:05 XIU2

正好有空,就顺便研究下,不过试了下发现似乎不好完美实现。

因为理想情况下应该为:延迟测速可用 IP 数量等于 10 时,立即终止所有延迟测速线程,停止创建新线程,再继续后续步骤。 但我发现 停止创建新线程 可以实现,而 立即终止所有延迟测速线程 有点麻烦,主要问题在于这些线程处理的都是网络链接,而非本地计算,因此并不是说终止就立即终止,实际上终止这些线程也是需要时间的,而我半吊子的 Golang 也不好解决该问题,于是干脆停止创建新线程并丢弃所有后续线程的延迟测速结果。

这是我编译出来的测试版(因为是测试,所以代码写死了 10 个):CloudflareST_beta.zip

使用时,看似延迟测速结果只有 10 个,但实际上还是测速了 200 个(取决于 -n 延迟测速线程参数,默认为 200),只不过当可用 IP 数量大于等于 10 个时,后续的 IP 延迟测速结果都被丢弃了。

不过因为是多线程操作的原因,偶尔可能会遇到最终测速结果是 11 个的问题(即时间卡的很巧)。


这种实现方法比较简单,只需要添加两处判断即可,代码修改如下:

// tcping.go

func (p *Ping) Run() utils.PingDelaySet {
	if len(p.ips) == 0 {
		return p.csv
	}
	if Httping {
		fmt.Printf("开始延迟测速(模式:HTTP,端口:%d,平均延迟上限:%v ms,平均延迟下限:%v ms)\n", TCPPort, utils.InputMaxDelay.Milliseconds(), utils.InputMinDelay.Milliseconds())
	} else {
		fmt.Printf("开始延迟测速(模式:TCP,端口:%d,平均延迟上限:%v ms,平均延迟下限:%v ms)\n", TCPPort, utils.InputMaxDelay.Milliseconds(), utils.InputMinDelay.Milliseconds())
	}
	for _, ip := range p.ips {
		// 这里加了个可用 IP 数量判断,大于等于 10 个就退出循环,不再创建新延迟测速线程(因为只是测试,所以是写死的 10 个)
		if len(p.csv) >= 10 {
			break
		}
		p.wg.Add(1)
		p.control <- false
		go p.start(ip)
	}
	p.wg.Wait()
	p.bar.Done()
	sort.Sort(p.csv)
	return p.csv
}

// ...
// ...
// ...

func (p *Ping) tcpingHandler(ip *net.IPAddr) {
	recv, totalDlay := p.checkConnection(ip)
	nowAble := len(p.csv)
	if recv != 0 {
		nowAble++
	}
	// 这里加了个判断,用于延迟测速后判断可用 IP 数量大于 10 就退出,不再新增可用 IP 数量、不再处理后续的延迟测速结果
	if nowAble > 10 {
		return
	}
	p.bar.Grow(1, strconv.Itoa(nowAble))
	if recv == 0 {
		return
	}
	data := &utils.PingData{
		IP:       ip,
		Sended:   PingTimes,
		Received: recv,
		Delay:    totalDlay / time.Duration(recv),
	}
	p.appendIPData(data)
}

XIU2 avatar May 27 '23 07:05 XIU2

或者说你预先知道了这些可用 IP 的延迟/丢包情况都差不多

对的,因为HTTP模式一般是配合机场代码使用,测速相同的地区,基本大差不差

这是我编译出来的测试版(因为是测试,所以代码写死了 10 个):CloudflareST_beta.zip

哇,真速度~晚上电脑后试一下

1265578519 avatar May 27 '23 10:05 1265578519

测试好用!我觉得现在这样已经可以满足需求,基本3秒就能从4w个ip中赛选出来10个直接开始下载测试,至少现在不会测出五千个可用ip的情况了

1265578519 avatar May 27 '23 16:05 1265578519

那就行,考虑到不清楚是否有其他人需要该功能,所以正式版暂不会添加该功能,你先暂时用着这个测试版吧。

XIU2 avatar May 28 '23 02:05 XIU2

Can an android version be made? Its very useful if someone is only using ips from some specific region. Say for example you need a Europe IP because your server is in Europe so just quickly find a working IP from that region instead of testing everything

t-e-s-tweb avatar Aug 30 '23 18:08 t-e-s-tweb

@t-e-s-tweb #61 、https://github.com/xianshenglu/cloudflare-ip-tester-app

XIU2 avatar Aug 31 '23 00:08 XIU2