暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ip_resolver.go 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // ip_resolver.go
  2. package client
  3. import (
  4. "net"
  5. "os"
  6. "strings"
  7. )
  8. // func main() {
  9. // // 1. 用户可以在yaml配置:hostname: "192.168.3.190" 或 "kendemacbook-air.local"
  10. // // 2. 如果不配置,自动获取
  11. // yamlHostname := "" // "kendemacbook-air.local" // 从yaml读取,可以设为空、IP或主机名
  12. // ip := GetIP(yamlHostname)
  13. // fmt.Printf("服务IP: %s\n", ip)
  14. // }
  15. // GetIP 获取IP地址 configHostname 主机名称或者ip地址
  16. func GetServiceIP(configHostname string) string {
  17. // 1. 如果yaml配置了,直接用
  18. if configHostname != "" {
  19. return parseToIP(configHostname)
  20. }
  21. // 2. 获取主机名(这很少出错)
  22. hostname, _ := os.Hostname()
  23. // 3. 解析为IP
  24. return parseToIP(hostname)
  25. }
  26. // parseToIP 解析为IP(可以是IP或主机名)
  27. func parseToIP(address string) string {
  28. // 如果本来就是IP,直接返回
  29. if ip := net.ParseIP(address); ip != nil {
  30. return ip.String()
  31. }
  32. // 是主机名,加上.local后缀
  33. if !strings.Contains(address, ".") {
  34. address = address + ".local"
  35. }
  36. // 解析DNS
  37. ips, err := net.LookupHost(address)
  38. if err != nil || len(ips) == 0 {
  39. return getSimpleIP()
  40. }
  41. // 取第一个非127.0.0.1的IPv4
  42. for _, ip := range ips {
  43. if ip == "127.0.0.1" || ip == "::1" {
  44. continue
  45. }
  46. if parsedIP := net.ParseIP(ip); parsedIP != nil && parsedIP.To4() != nil {
  47. return ip
  48. }
  49. }
  50. // 没有合适的,返回第一个
  51. return ips[0]
  52. }
  53. // getSimpleIP 最简单的获取本机IP方法
  54. func getSimpleIP() string {
  55. conn, err := net.Dial("udp", "8.8.8.8:80")
  56. if err != nil {
  57. return "127.0.0.1"
  58. }
  59. defer conn.Close()
  60. return conn.LocalAddr().(*net.UDPAddr).IP.String()
  61. }