package utils import ( //"fmt" "github.com/go-ping/ping" //"net" "io/ioutil" "net/http" "strings" "time" ) type ConnStatus struct { Addr string IsReachable bool Delay time.Duration TTL int } // 获取本地主机 IP 地址 func getLocalIP() string { resp, err := http.Get("https://api.ipify.org") if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } ip := strings.TrimSpace(string(body)) return ip } func GetConnStatus(remoteIP string) (*ConnStatus, error) { // 本地主机 IP 地址 //localIP := getLocalIP() //print("!@#@#!") //print(localIP) conn := ConnStatus{ Addr: remoteIP, IsReachable: false, } pinger, err := ping.NewPinger(remoteIP) if err != nil { return nil, err } pinger.Count = 5 // 设置 ping 次数为 5 // pinger.Interval = 1 // 设置 ping 时间间隔为 1 秒 //pinger.Timeout = 2 // 设置 ping 超时时间为 2 秒 //pinger.SetPrivileged(true) // 设置使用特权模式以获取 TTL 值 pinger.OnRecv = func(pkt *ping.Packet) { //fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\n", // pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.Ttl) conn.TTL = pkt.Ttl } /*pinger.OnDuplicateRecv = func(pkt *ping.Packet) { fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.Ttl) }*/ pinger.OnFinish = func(stats *ping.Statistics) { //fmt.Printf("\n--- %s ping statistics ---\n", stats.Addr) //fmt.Printf("%d packets transmitted, %d packets received, %v%% packet loss\n", // stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) //fmt.Printf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n", // stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) if stats.PacketLoss == 0.0 { conn.IsReachable = true } conn.Delay = stats.AvgRtt } err = pinger.Run() // Blocks until finished. if err != nil { return nil, err } return &conn, nil }