macos - 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 地址。有谁之前经历过这个吗?
解决方案
.local
您尝试解析的地址不是常规的 DNS 条目,它是本地网络的特殊条目。它有几个名称,例如bonjour
,avahi
等等。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$
。
推荐阅读
- java - spring boot项目定义依赖类为spring bean
- c# - 使用来自 C# 的解析参数执行 Python 脚本
- javascript - 窗口滚动事件——是否需要防止冒泡?
- awk - 从文件打印字符串和输入
- powershell - Windows 7 上的 PowerShell SMTPClient 失败(“需要身份验证”);适用于 Windows 10
- swift - 小窗口的大小
- python - 在 google colab 中运行 python 脚本,nohup 给出 ImportError
- python - Jupyer 无法识别不确定性库
- python - 每次运行 Python 脚本时,如何关闭使用 Python 脚本创建的现有文件?
- c# - basicHttpBinding、netTcpBinding、protobuff扩展的序列化性能