X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=p2p%2Fexternal_ip.go;fp=p2p%2Fexternal_ip.go;h=5c2c90cfeb03e25850aa25d24a08b54a3756aa92;hb=54373c1a3efe0e373ec1605840a4363e4b246c46;hp=0000000000000000000000000000000000000000;hpb=ee01d543fdfe1fd0a4d548965c66f7923ea7b062;p=bytom%2Fvapor.git diff --git a/p2p/external_ip.go b/p2p/external_ip.go new file mode 100644 index 00000000..5c2c90cf --- /dev/null +++ b/p2p/external_ip.go @@ -0,0 +1,47 @@ +package p2p + +import ( + "net" +) + +// ExternalIPv4 returns the first IPv4 available. +func ExternalIPv4() (string, error) { + ifaces, err := net.Interfaces() + if err != nil { + return "", err + } + + for _, iface := range ifaces { + // interface down + if iface.Flags&net.FlagUp == 0 { + continue + } + // loopback interface + if iface.Flags&net.FlagLoopback != 0 { + continue + } + addrs, err := iface.Addrs() + if err != nil { + return "", err + } + + for _, addr := range addrs { + 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() { + continue + } + ip = ip.To4() + if ip == nil { + continue // not an ipv4 address + } + return ip.String(), nil + } + } + return "127.0.0.1", nil +}