pingip.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package netutils
  2. import (
  3. "fmt"
  4. "net"
  5. "time"
  6. )
  7. func PingIP(ipOrDomain string) (string, time.Duration, int, error) {
  8. ipAddr, err := net.ResolveIPAddr("ip", ipOrDomain)
  9. if err != nil {
  10. return "", 0, 0, fmt.Errorf("failed to resolve IP address: %v", err)
  11. }
  12. ip := ipAddr.IP.String()
  13. start := time.Now()
  14. conn, err := net.Dial("ip:icmp", ip)
  15. if err != nil {
  16. return ip, 0, 0, fmt.Errorf("failed to establish ICMP connection: %v", err)
  17. }
  18. defer conn.Close()
  19. icmpMsg := []byte{8, 0, 0, 0, 0, 1, 0, 0}
  20. _, err = conn.Write(icmpMsg)
  21. if err != nil {
  22. return ip, 0, 0, fmt.Errorf("failed to send ICMP message: %v", err)
  23. }
  24. reply := make([]byte, 1500)
  25. err = conn.SetReadDeadline(time.Now().Add(3 * time.Second))
  26. if err != nil {
  27. return ip, 0, 0, fmt.Errorf("failed to set read deadline: %v", err)
  28. }
  29. _, err = conn.Read(reply)
  30. if err != nil {
  31. return ip, 0, 0, fmt.Errorf("failed to read ICMP reply: %v", err)
  32. }
  33. elapsed := time.Since(start)
  34. pingTime := elapsed.Round(time.Millisecond)
  35. ttl := int(reply[8])
  36. return ip, pingTime, ttl, nil
  37. }