46 lines
885 B
Go
46 lines
885 B
Go
package net
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
// get internal ip
|
|
func LocalIP() string {
|
|
var (
|
|
err error
|
|
addrs []net.Addr
|
|
inters []net.Interface
|
|
)
|
|
if inters, err = net.Interfaces(); err != nil {
|
|
return ""
|
|
}
|
|
for _, inter := range inters {
|
|
if inter.Flags&net.FlagUp != net.FlagUp {
|
|
continue
|
|
}
|
|
if !strings.HasPrefix(inter.Name, "lo") {
|
|
if addrs, err = inter.Addrs(); err != nil {
|
|
continue
|
|
}
|
|
for _, addr := range addrs {
|
|
if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
|
|
if ipNet.IP.To4() != nil {
|
|
return ipNet.IP.String()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return "localhost"
|
|
}
|
|
|
|
// extract ip address
|
|
func Extract(addr string) (string, error) {
|
|
// if addr is already specified then it's directly returned
|
|
if len(addr) > 0 && (addr != "0.0.0.0" && addr != "[::]" && addr != "::") {
|
|
return addr, nil
|
|
}
|
|
return LocalIP(), nil
|
|
}
|