2016-02-10 2 views
2

Учитывая следующий код:Как получить все IP-адреса, назначенные машине?

// iptest 
package main 

import (
    "fmt" 
    "net" 
    "os" 
) 

func main() { 
    host, _ := os.Hostname() 
    addrs, _ := net.LookupIP(host) 
    for _, addr := range addrs { 
     if ipv4 := addr.To4(); ipv4 != nil { 
      fmt.Println("IPv4: ", ipv4) 
     } 
    } 
} 

У меня проблема, где он возвращает только первый IP-адрес, назначенный адаптеру. Это кажется проблемой только для систем, имеющих определенный суффикс DNS. Если он не определен, он отлично работает и сообщает обо всех назначенных IP-адресах.

+1

'LookupIP' может искать IP-адрес только через распознаватель с заданным именем хоста. Он ничего не знает о том, какие IP-адреса связаны с интерфейсами. – JimB

+0

Спасибо @JimB. Любая идея, почему она будет работать нормально в системе, которая не имеет DNS-суффикса? – siliconghost

+1

Если у него нет имени DNS, это, вероятно, означает, что оно указано в/etc/hosts или просмотрено через другой механизм через /etc/nsswitch.conf. Если вам нужны все локальные IP-адреса, вы должны сами их перечислить. – JimB

ответ

4

Если вы пытаетесь получить адреса, назначенные в данный момент на устройство. Я думаю, вам стоит использовать net.InterfaceAddrs() вместо того, чтобы пытаться выполнить поиск DNS для имени хоста. Вот краткий пример, который даст вам все IP-адреса на локальном компьютере.

package main 

import (
    "fmt" 
    "net" 
) 

func main() { 
    addrs, _ := net.InterfaceAddrs() 
    fmt.Printf("%v\n", addrs) 
    for _, addr := range addrs { 
     fmt.Println("IPv4: ", addr) 
    } 
} 
+0

Кроме того, если вам интересно узнать больше о разрешении Go DNS, вы можете посетить здесь: https://golang.org/pkg/net/#hdr-Name_Resolution – Sean

+0

Спасибо, это именно то, что мне нужно! – siliconghost