2016-02-10 69 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