You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ping.go 2.0 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package utils
  2. import (
  3. //"fmt"
  4. "github.com/go-ping/ping"
  5. //"net"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. "time"
  10. )
  11. type ConnStatus struct {
  12. Addr string
  13. IsReachable bool
  14. Delay time.Duration
  15. TTL int
  16. }
  17. // 获取本地主机 IP 地址
  18. func getLocalIP() string {
  19. resp, err := http.Get("https://api.ipify.org")
  20. if err != nil {
  21. panic(err)
  22. }
  23. defer resp.Body.Close()
  24. body, err := ioutil.ReadAll(resp.Body)
  25. if err != nil {
  26. panic(err)
  27. }
  28. ip := strings.TrimSpace(string(body))
  29. return ip
  30. }
  31. func GetConnStatus(remoteIP string) (*ConnStatus, error) {
  32. // 本地主机 IP 地址
  33. //localIP := getLocalIP()
  34. //print("!@#@#!")
  35. //print(localIP)
  36. conn := ConnStatus{
  37. Addr: remoteIP,
  38. IsReachable: false,
  39. }
  40. pinger, err := ping.NewPinger(remoteIP)
  41. if err != nil {
  42. return nil, err
  43. }
  44. pinger.Count = 5 // 设置 ping 次数为 5
  45. // pinger.Interval = 1 // 设置 ping 时间间隔为 1 秒
  46. //pinger.Timeout = 2 // 设置 ping 超时时间为 2 秒
  47. //pinger.SetPrivileged(true) // 设置使用特权模式以获取 TTL 值
  48. pinger.OnRecv = func(pkt *ping.Packet) {
  49. //fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\n",
  50. // pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.Ttl)
  51. conn.TTL = pkt.Ttl
  52. }
  53. /*pinger.OnDuplicateRecv = func(pkt *ping.Packet) {
  54. fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\n",
  55. pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.Ttl)
  56. }*/
  57. pinger.OnFinish = func(stats *ping.Statistics) {
  58. //fmt.Printf("\n--- %s ping statistics ---\n", stats.Addr)
  59. //fmt.Printf("%d packets transmitted, %d packets received, %v%% packet loss\n",
  60. // stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
  61. //fmt.Printf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n",
  62. // stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt)
  63. if stats.PacketLoss == 0.0 {
  64. conn.IsReachable = true
  65. }
  66. conn.Delay = stats.AvgRtt
  67. }
  68. err = pinger.Run() // Blocks until finished.
  69. if err != nil {
  70. return nil, err
  71. }
  72. return &conn, nil
  73. }

公共库

Contributors (1)