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.
46 lines
885 B
46 lines
885 B
8 years ago
|
package networkhelper
|
||
8 years ago
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"net"
|
||
|
)
|
||
|
|
||
|
// GetExternalIP returns the ip address of local network interface, not the
|
||
|
// loopback device.
|
||
|
func GetExternalIP() (string, error) {
|
||
|
ifaces, err := net.Interfaces()
|
||
|
if err != nil {
|
||
|
return "", 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 "", 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 "", errors.New("are you connected to the network?")
|
||
|
}
|