| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // 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()
- }
|