Как получить локальный IP-адрес в Go?
Я хочу получить IP-адрес компьютера. Я использовал код ниже, но он возвращает 127.0.0.1
.
Я хочу получить IP-адрес, например 10.32.10.111
, вместо адреса loopback.
name, err := os.Hostname()
if err != nil {
fmt.Printf("Oops: %v\n", err)
return
}
addrs, err := net.LookupHost(name)
if err != nil {
fmt.Printf("Oops: %v\n", err)
return
}
for _, a := range addrs {
fmt.Println(a)
}
Ответы
Ответ 1
Вам необходимо пропустить все сетевые интерфейсы
ifaces, err := net.Interfaces()
// handle err
for _, i := range ifaces {
addrs, err := i.Addrs()
// handle 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
}
// process IP address
}
}
Play (взято из util/helper.go)
Ответ 2
Вот лучшее решение для извлечения предпочтительного исходящего IP-адреса, когда на машине существует несколько интерфейсов ip.
import (
"log"
"net"
"strings"
)
// Get preferred outbound ip of this machine
func GetOutboundIP() net.IP {
conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP
}
Ответ 3
net.LookupHost()
на вашем os.Hostname()
, вероятно, всегда будет давать вам 127.0.0.1, потому что это то, что в вашем /etc/hosts
или эквивалентном.
Я думаю, что вы хотите использовать net.InterfaceAddrs()
:
func InterfaceAddrs() ([]Addr, error)
InterfaceAddrs возвращает список адресов системного сетевого интерфейса.
Ответ 4
Чтобы убедиться, что вы получаете неквалифицированный адрес, просто убедитесь, что IP-адрес не является петлей при выполнении итерации.
// GetLocalIP returns the non loopback local IP of the host
func GetLocalIP() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
// check the address type and if it is not a loopback the display it
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
return ""
}
Ответ 5
Это сработало для меня:
host, _ := os.Hostname()
addrs, _ := net.LookupIP(host)
for _, addr := range addrs {
if ipv4 := addr.To4(); ipv4 != nil {
fmt.Println("IPv4: ", ipv4)
}
}
В отличие от примера плаката, он возвращает только обратные адреса без обратной связи, например. 10.120.X.X.
Ответ 6
func resolveHostIp() (string) {
netInterfaceAddresses, err := net.InterfaceAddrs()
if err != nil { return "" }
for _, netInterfaceAddress := range netInterfaceAddresses {
networkIp, ok := netInterfaceAddress.(*net.IPNet)
if ok && !networkIp.IP.IsLoopback() && networkIp.IP.To4() != nil {
ip := networkIp.IP.String()
fmt.Println("Resolved Host IP: " + ip)
return ip
}
}
return ""
}