1
0

pingip.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package netutils
  2. import (
  3. "fmt"
  4. "net"
  5. "time"
  6. )
  7. // TCP ping
  8. func TCPPing(ipOrDomain string) (time.Duration, error) {
  9. start := time.Now()
  10. conn, err := net.DialTimeout("tcp", ipOrDomain+":80", 3*time.Second)
  11. if err != nil {
  12. return 0, fmt.Errorf("failed to establish TCP connection: %v", err)
  13. }
  14. defer conn.Close()
  15. elapsed := time.Since(start)
  16. pingTime := elapsed.Round(time.Millisecond)
  17. return pingTime, nil
  18. }
  19. // UDP Ping
  20. func UDPPing(ipOrDomain string) (time.Duration, error) {
  21. start := time.Now()
  22. conn, err := net.DialTimeout("udp", ipOrDomain+":80", 3*time.Second)
  23. if err != nil {
  24. return 0, fmt.Errorf("failed to establish UDP connection: %v", err)
  25. }
  26. defer conn.Close()
  27. elapsed := time.Since(start)
  28. pingTime := elapsed.Round(time.Millisecond)
  29. return pingTime, nil
  30. }
  31. // Traditional ICMP ping
  32. func PingIP(ipOrDomain string) (string, time.Duration, int, error) {
  33. ipAddr, err := net.ResolveIPAddr("ip", ipOrDomain)
  34. if err != nil {
  35. return "", 0, 0, fmt.Errorf("failed to resolve IP address: %v", err)
  36. }
  37. ip := ipAddr.IP.String()
  38. start := time.Now()
  39. conn, err := net.Dial("ip:icmp", ip)
  40. if err != nil {
  41. return ip, 0, 0, fmt.Errorf("failed to establish ICMP connection: %v", err)
  42. }
  43. defer conn.Close()
  44. icmpMsg := []byte{8, 0, 0, 0, 0, 1, 0, 0}
  45. _, err = conn.Write(icmpMsg)
  46. if err != nil {
  47. return ip, 0, 0, fmt.Errorf("failed to send ICMP message: %v", err)
  48. }
  49. reply := make([]byte, 1500)
  50. err = conn.SetReadDeadline(time.Now().Add(3 * time.Second))
  51. if err != nil {
  52. return ip, 0, 0, fmt.Errorf("failed to set read deadline: %v", err)
  53. }
  54. _, err = conn.Read(reply)
  55. if err != nil {
  56. return ip, 0, 0, fmt.Errorf("failed to read ICMP reply: %v", err)
  57. }
  58. elapsed := time.Since(start)
  59. pingTime := elapsed.Round(time.Millisecond)
  60. ttl := int(reply[8])
  61. return ip, pingTime, ttl, nil
  62. }