Open 1265578519 opened 1 year ago
这个的话,我不确定是否为大众需求(就是不少人会需要的功能)。
一般什么情况下会产生该需求?请举几个例子。 毕竟一般来说,大家都是希望延迟测速所有 IP 后,排序得到延迟最低的 IP,再去下载测速或直接使用。而如果只需要 10 个可用的话,那么代表你不在乎可用 IP 的延迟/丢包,或者说你预先知道了这些可用 IP 的延迟/丢包情况都差不多,因此也不挑。
如果没什么人会用到的话,我可能会懒得去添加。。。对该功能感兴趣的其他人也可以在下面回复或给本条回复点表情,我看看有没有其他人需要该功能的。
正好有空,就顺便研究下,不过试了下发现似乎不好完美实现。
因为理想情况下应该为:延迟测速可用 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)
}
或者说你预先知道了这些可用 IP 的延迟/丢包情况都差不多
对的,因为HTTP模式一般是配合机场代码使用,测速相同的地区,基本大差不差
这是我编译出来的测试版(因为是测试,所以代码写死了 10 个):CloudflareST_beta.zip
哇,真速度~晚上电脑后试一下
测试好用!我觉得现在这样已经可以满足需求,基本3秒就能从4w个ip中赛选出来10个直接开始下载测试,至少现在不会测出五千个可用ip的情况了
那就行,考虑到不清楚是否有其他人需要该功能,所以正式版暂不会添加该功能,你先暂时用着这个测试版吧。
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 #61 、https://github.com/xianshenglu/cloudflare-ip-tester-app
功能需求
http模式下,检测到可用ip超过10就跳过后续未完成的检测延迟,直接进入下载测速阶段节省时间
预期目标