github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/p2p/external_ip.go (about) 1 package p2p 2 3 import ( 4 "net" 5 ) 6 7 // ExternalIPv4 returns the first IPv4 available. 8 func ExternalIPv4() (string, error) { 9 ifaces, err := net.Interfaces() 10 if err != nil { 11 return "", err 12 } 13 14 for _, iface := range ifaces { 15 // interface down 16 if iface.Flags&net.FlagUp == 0 { 17 continue 18 } 19 // loopback interface 20 if iface.Flags&net.FlagLoopback != 0 { 21 continue 22 } 23 addrs, err := iface.Addrs() 24 if err != nil { 25 return "", err 26 } 27 28 for _, addr := range addrs { 29 var ip net.IP 30 switch v := addr.(type) { 31 case *net.IPNet: 32 ip = v.IP 33 case *net.IPAddr: 34 ip = v.IP 35 } 36 if ip == nil || ip.IsLoopback() { 37 continue 38 } 39 ip = ip.To4() 40 if ip == nil { 41 continue // not an ipv4 address 42 } 43 return ip.String(), nil 44 } 45 } 46 return "127.0.0.1", nil 47 }