You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
1.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* Created by GoLand.
* User: link1st
* Date: 2019-07-25
* Time: 17:27
*/
package helper
import (
"net"
)
// 获取服务器Ip
// func GetServerIp() (ip string) {
// addrs, err := net.InterfaceAddrs()
// if err != nil {
// return ""
// }
// for _, address := range addrs {
// // 检查ip地址判断是否回环地址
// if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
// if ipNet.IP.To4() != nil {
// ip = ipNet.IP.String()
// }
// }
// }
// return
// }
/**** 问题我在本地多网卡机器上运行分布式场景此函数返回的ip有误导致rpc连接失败。 遂google结果如下
*** 1、https://www.jianshu.com/p/301aabc06972
*** 2、https://www.cnblogs.com/chaselogs/p/11301940.html
****/
func GetServerIp() string {
ip, err := externalIP()
if err != nil {
return ""
}
return ip.String()
}
func externalIP() (net.IP, error) {
ifaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range ifaces {
if iface.Flags&net.FlagUp == 0 {
continue // interface down
}
if iface.Flags&net.FlagLoopback != 0 {
continue // loopback interface
}
addrs, err := iface.Addrs()
if err != nil {
return nil, err
}
for _, addr := range addrs {
ip := getIpFromAddr(addr)
if ip == nil {
continue
}
return ip, nil
}
}
return nil, err
}
func getIpFromAddr(addr net.Addr) net.IP {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip == nil || ip.IsLoopback() {
return nil
}
ip = ip.To4()
if ip == nil {
return nil // not an ipv4 address
}
return ip
}