github.com/lingyao2333/mo-zero@v1.4.1/core/netx/ip.go (about)

     1  package netx
     2  
     3  import "net"
     4  
     5  // InternalIp returns an internal ip.
     6  func InternalIp() string {
     7  	infs, err := net.Interfaces()
     8  	if err != nil {
     9  		return ""
    10  	}
    11  
    12  	for _, inf := range infs {
    13  		if isEthDown(inf.Flags) || isLoopback(inf.Flags) {
    14  			continue
    15  		}
    16  
    17  		addrs, err := inf.Addrs()
    18  		if err != nil {
    19  			continue
    20  		}
    21  
    22  		for _, addr := range addrs {
    23  			if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
    24  				if ipnet.IP.To4() != nil {
    25  					return ipnet.IP.String()
    26  				}
    27  			}
    28  		}
    29  	}
    30  
    31  	return ""
    32  }
    33  
    34  func isEthDown(f net.Flags) bool {
    35  	return f&net.FlagUp != net.FlagUp
    36  }
    37  
    38  func isLoopback(f net.Flags) bool {
    39  	return f&net.FlagLoopback == net.FlagLoopback
    40  }