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

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

Open
1265578519 opened this issue May 26, 2023 · 7 comments
Labels
功能建议 功能与建议

Comments

@1265578519
Copy link

功能需求

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

预期目标

1

@1265578519 1265578519 added the 功能建议 功能与建议 label May 26, 2023
@XIU2
Copy link
Owner

XIU2 commented May 27, 2023

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

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

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

@XIU2
Copy link
Owner

XIU2 commented May 27, 2023

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

因为理想情况下应该为:延迟测速可用 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)
}

@1265578519
Copy link
Author

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

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

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

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

@1265578519
Copy link
Author

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

@XIU2
Copy link
Owner

XIU2 commented May 28, 2023

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

@t-e-s-tweb
Copy link

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

@XIU2
Copy link
Owner

XIU2 commented Aug 31, 2023

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

No branches or pull requests

3 participants