首页 > 解决方案 > net.LookUpHost() 使用 os.Hostname() 后没有输出这样的主机

问题描述

我目前正在尝试学习编程语言,并遇到了这个奇怪的问题。我创建了一个简单的 go 应用程序,它成功地获取了主机名,然后我尝试使用它来获取我的地址。最后我遍历这些地址。

package main

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

func main() {
    name, error := os.Hostname()
    fmt.Println("Name: " + name)
    fmt.Print("Error: ")
    fmt.Println(error)

    addrs, err := net.LookupHost(name)

    fmt.Println(addrs)

    fmt.Println(err)

    for indx, addr := range addrs {
        fmt.Println("Address number " + strconv.Itoa(indx) + ": " + addr)
    }
}

其输出如下:

Name: My-macbook.local
Error: <nil>
[]
lookup My-macbook.local: no such host

我也尝试使用 net.LookUpIP(name),结果相同。我已连接到互联网,并检查了我在系统首选项 -> 网络中是否有一个 IP 地址。我目前使用的是装有 macOS Sierra 的 Macbook Pro。

我的朋友使用完全相同版本的 go 运行完全相同的代码并返回了两个地址,所以我有什么东西阻止我看到我的 IP 地址。有谁之前经历过这个吗?

标签: macosgobonjourmdns

解决方案


.local您尝试解析的地址不是常规的 DNS 条目,它是本地网络的特殊条目。它有几个名称,例如bonjouravahi等等。RFC 将其称为mdns https://en.wikipedia.org/wiki/.local,另请参阅dns 服务发现

根据文档,您应该尝试设置此环境变量export GODEBUG=netdns=cgo以强制 golang dns 解析器调用系统库。确实,纯 golang DNS 解析器无法解析 mdns

您还可以尝试替代 mdns golang 实现,例如https://github.com/hashicorp/mdns

另请注意,net 包提供了一个DefaultResolver变量,您可以使用自定义实现覆盖该变量来解析\.local$


推荐阅读