go net:根据Mac OS上/etc/hosts中多个别名的顺序,返回不同的地址列表,

bvhaajcl  于 5个月前  发布在  Go
关注(0)|答案(3)|浏览(49)

TL;DR - net.LookupIP 可能根据 /etc/hosts Map中的多个名称的顺序返回不同的地址列表(例如 127.0.0.1 my.local localhost )。我不知道这是否应该令人惊讶;然而,我确实有一个 NATS 客户端以及 an official NATS sample client 故障发生在我身上,我想知道问题可能是什么。

您使用的 Go 版本是 ( go version )?

go version go1.10 darwin/amd64

这个问题在最新版本中是否会重现?

最新版本。

您正在使用什么操作系统和处理器架构 ( go env )?

darwin amd64

您做了什么?

  • 使用以下测试代码:
package main

import (
  "fmt"
  "net"
)

func main() {
  ips, _ := net.LookupIP("localhost")
  fmt.Printf("IPs: %v\n", ips)
}
  • 使用以下 /etc/hosts :
127.0.0.1	localhost my.local       # This line will be varied in the tests below
255.255.255.255	broadcasthost
::1             localhost
  • 在更改 /etc/hosts 后运行测试程序四次,同时变化 1)解析器和 2) /etc/hostslocalhostmy.local 的顺序。(更改 /etc/hosts 后运行 sudo killall -HUP mDNSResponder )。
# localhost FIRST (`127.0.0.1 localhost my.local`) and pure GO resolver:
$ GODEBUG=netdns=go+1 go run junk.go
go package net: GODEBUG setting forcing use of Go's resolver
IPs: [::1 127.0.0.1]
# localhost FIRST (`127.0.0.1 localhost my.local`) and CGO resolver:
$ GODEBUG=netdns=1 go run junk.go
go package net: using cgo DNS resolver
IPs: [::1 127.0.0.1]
# localhost SECOND (`127.0.0.1 my.local localhost`) and pure GO resolver:
$ GODEBUG=netdns=go+1 go run junk.go
go package net: GODEBUG setting forcing use of Go's resolver
IPs: [::1 127.0.0.1]
# localhost SECOND (`127.0.0.1 my.local localhost`) and CGO resolver:
$ GODEBUG=netdns=1 go run junk.go
go package net: using cgo DNS resolver
IPs: [127.0.0.1]                # <---- This is the oddball; no IPv6 address

您期望看到什么?

我期望在所有四个测试中返回的 IP 集是相同的。

您实际看到了什么?

localhost -last 和 cgo 的组合导致解析了不同的地址集。

oxf4rvwz

oxf4rvwz2#

RFC 2782表示我们应该以伪随机顺序返回地址(参见“权重”的讨论)。我没有仔细查看,但我怀疑这就是发生在这里的情况。

o7jaxewo

o7jaxewo3#

IPs: [::1, 127.0.0.1]

相关问题