如何获取分配给计算机的所有IP地址?

3

给定以下代码:

// 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
谢谢@JimB。不知道为什么在没有定义DNS后缀的系统上可以正常工作? - siliconghost
1
如果它没有DNS名称,那可能意味着它在/etc/hosts中列出,或者通过/etc/nsswitch.conf通过另一种机制查找。如果您想要所有本地IP地址,则必须自己枚举它们。 - JimB
@JimB 但这似乎无法解释为什么当我在另一个系统上使用完全相同的代码时,我不必自己枚举它们。该系统唯一的区别是未定义DNS后缀。此外,在不工作的系统上定义了主机名,并且我已确认Go通过fmt.Println(hostname)正确检测到它。 - siliconghost
2
“LookupIP” 返回本地解析器响应的内容。我不确定你所说的“DNS后缀”具体指的是什么,但首先要检查你要查询的名称是否在系统级别上被解析(例如是否从/etc/hosts或其他nsswitch来源进行解析)。同时你也可以运行 GODEBUG=netdns=1 命令来查看go net包所做的解析决策是否有任何有用的信息。 - JimB
1个回答

6

如果您想获取当前分配给机器的地址,我认为您应该考虑使用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)
    }
}

另外,如果您想了解更多关于Go DNS解析的信息,可以访问此处:https://golang.org/pkg/net/#hdr-Name_Resolution - Sean
谢谢,这正是我需要的! - siliconghost
注意:在 Go 版本 1.17.3(以及可能的早期版本)上运行此代码还会显示 IPv6 地址(在 Windows 10 上)。 - AndyS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接