Подтвердить что ты не робот

Как получить локальный 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)
}  
4b9b3361

Ответ 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 ""
}