// ip_resolver.go package client import ( "net" "os" "strings" ) // func main() { // // 1. 用户可以在yaml配置:hostname: "192.168.3.190" 或 "kendemacbook-air.local" // // 2. 如果不配置,自动获取 // yamlHostname := "" // "kendemacbook-air.local" // 从yaml读取,可以设为空、IP或主机名 // ip := GetIP(yamlHostname) // fmt.Printf("服务IP: %s\n", ip) // } // GetIP 获取IP地址 configHostname 主机名称或者ip地址 func GetServiceIP(configHostname string) string { // 1. 如果yaml配置了,直接用 if configHostname != "" { return parseToIP(configHostname) } // 2. 获取主机名(这很少出错) hostname, _ := os.Hostname() // 3. 解析为IP return parseToIP(hostname) } // parseToIP 解析为IP(可以是IP或主机名) func parseToIP(address string) string { // 如果本来就是IP,直接返回 if ip := net.ParseIP(address); ip != nil { return ip.String() } // 是主机名,加上.local后缀 if !strings.Contains(address, ".") { address = address + ".local" } // 解析DNS ips, err := net.LookupHost(address) if err != nil || len(ips) == 0 { return getSimpleIP() } // 取第一个非127.0.0.1的IPv4 for _, ip := range ips { if ip == "127.0.0.1" || ip == "::1" { continue } if parsedIP := net.ParseIP(ip); parsedIP != nil && parsedIP.To4() != nil { return ip } } // 没有合适的,返回第一个 return ips[0] } // getSimpleIP 最简单的获取本机IP方法 func getSimpleIP() string { conn, err := net.Dial("udp", "8.8.8.8:80") if err != nil { return "127.0.0.1" } defer conn.Close() return conn.LocalAddr().(*net.UDPAddr).IP.String() }