使用os.Hostname()

时间:2018-09-01 19:11:01

标签: macos go bonjour mdns

我目前正在尝试学习编程语言,并在这个奇怪的问题上感到困惑。 我创建了一个简单的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地址。以前有没有人经历过?

1 个答案:

答案 0 :(得分:1)

您要解析的.local地址不是常规的DNS条目,它是本地网络的特殊地址。它具有多个名称,例如bonjouravahi等。RFC将其称为mdns https://en.wikipedia.org/wiki/.local,另请参见dns service discovery

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

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

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