fix: 并发请求上游信息和路由检测

This commit is contained in:
spiritlhl 2025-08-11 02:25:27 +00:00
parent ab887766fb
commit 76508d7b27

View File

@ -7,6 +7,7 @@ import (
"net/http" "net/http"
"os" "os"
"runtime" "runtime"
"sync"
"time" "time"
"github.com/oneclickvirt/backtrace/bgptools" "github.com/oneclickvirt/backtrace/bgptools"
@ -24,6 +25,13 @@ type IpInfo struct {
Org string `json:"org"` Org string `json:"org"`
} }
type ConcurrentResults struct {
bgpResult string
backtraceResult string
bgpError error
backtraceError error
}
func main() { func main() {
go func() { go func() {
http.Get("https://hits.spiritlhl.net/backtrace.svg?action=hit&title=Hits&title_bg=%23555555&count_bg=%230eecf8&edge_flat=false") http.Get("https://hits.spiritlhl.net/backtrace.svg?action=hit&title=Hits&title_bg=%23555555&count_bg=%230eecf8&edge_flat=false")
@ -64,31 +72,61 @@ func main() {
} }
} }
preCheck := utils.CheckPublicAccess(3 * time.Second) preCheck := utils.CheckPublicAccess(3 * time.Second)
if preCheck.Connected { if !preCheck.Connected {
var targetIP string fmt.Println(Red("PreCheck IP Type Failed"))
if specifiedIP != "" { if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
targetIP = specifiedIP fmt.Println("Press Enter to exit...")
} else if info.Ip != "" { fmt.Scanln()
targetIP = info.Ip
} }
if targetIP != "" { return
}
var useIPv6 bool
switch preCheck.StackType {
case "DualStack":
useIPv6 = ipv6
case "IPv4":
useIPv6 = false
case "IPv6":
useIPv6 = true
default:
fmt.Println(Red("PreCheck IP Type Failed"))
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
fmt.Println("Press Enter to exit...")
fmt.Scanln()
}
return
}
results := ConcurrentResults{}
var wg sync.WaitGroup
var targetIP string
if specifiedIP != "" {
targetIP = specifiedIP
} else if info.Ip != "" {
targetIP = info.Ip
}
if targetIP != "" {
wg.Add(1)
go func() {
defer wg.Done()
result, err := bgptools.GetPoPInfo(targetIP) result, err := bgptools.GetPoPInfo(targetIP)
if err == nil { if err == nil {
fmt.Print(result.Result) results.bgpResult = result.Result
} }
} results.bgpError = err
}()
} }
if preCheck.Connected && preCheck.StackType == "DualStack" { wg.Add(1)
result := backtrace.BackTrace(ipv6) go func() {
fmt.Printf("%s\n", result) defer wg.Done()
} else if preCheck.Connected && preCheck.StackType == "IPv4" { result := backtrace.BackTrace(useIPv6)
result := backtrace.BackTrace(false) results.backtraceResult = result
fmt.Printf("%s\n", result) }()
} else if preCheck.Connected && preCheck.StackType == "IPv6" { wg.Wait()
result := backtrace.BackTrace(true) if results.bgpResult != "" {
fmt.Printf("%s\n", result) fmt.Print(results.bgpResult)
} else { }
fmt.Println(Red("PreCheck IP Type Failed")) if results.backtraceResult != "" {
fmt.Printf("%s\n", results.backtraceResult)
} }
fmt.Println(Yellow("准确线路自行查看详细路由,本测试结果仅作参考")) fmt.Println(Yellow("准确线路自行查看详细路由,本测试结果仅作参考"))
fmt.Println(Yellow("同一目标地址多个线路时,检测可能已越过汇聚层,除第一个线路外,后续信息可能无效")) fmt.Println(Yellow("同一目标地址多个线路时,检测可能已越过汇聚层,除第一个线路外,后续信息可能无效"))