Go 为什么http.Get(“http://[:]:1234”)可以工作?
我在写一个测试,我想让HTTP服务器监听一个随机端口,然后连接到这个端口。我写道:Go 为什么http.Get(“http://[:]:1234”)可以工作?,go,ip,Go,Ip,我在写一个测试,我想让HTTP服务器监听一个随机端口,然后连接到这个端口。我写道: mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println("foo") }) listener, err := net.Listen("tcp", ":0") fmt.Println(err) httpServer := &http.Serve
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("foo")
})
listener, err := net.Listen("tcp", ":0")
fmt.Println(err)
httpServer := &http.Server{Handler: mux}
go httpServer.Serve(listener)
fmt.Println("http://" + listener.Addr().String())
r, err := http.Get("http://" + listener.Addr().String())
fmt.Println(r)
fmt.Println(err)
我本想写net.Listen(“tcp”,“127.0.0.1:0”)
,但不小心写了net.Listen(“tcp”,“127.0.0:0”)
对于“http://”+listener.Addr().String()
,它将打印:
据我所知,“括号-冒号-括号”是指“所有接口”
令我惊讶的是,http.Get(“http://[:]:1709”)
可以工作,它连接到Web服务器并打印“foo”
“”是一个有效地址吗?至少在Linux系统上是这样,这会导致连接到本地主机 地址
:
在6addr\u ANY中是的,通常在侦听与系统上任何IPv6地址的连接时使用。它类似于IPv4中的INADDR\u ANY
,也称为0.0.0
偶尔有人试图使用这些地址中的一个作为传出连接的目标地址。发生这种情况时:
当与0.0.0.0
建立传出连接时,Linux实际上是从127.0.0.1
连接到127.0.0.1
类似地,当与::
建立传出连接时,Linux实际上从::1
连接到::1
。下面是一个例子,取自我的一个网站(它恰好是一个IP地址查找工具):
[error@murloc~]$curl-k-H“主机:myip.addr.space”https://[:]:8443/
::1
为完整起见,以下是IPv4版本:
[error@murloc~]$curl-k-H“主机:myip.addr.space”https://0.0.0.0:8443/
127.0.0.1
请注意,这是特定于操作系统的。你会收到的。我在Windows上。那就有点奇怪了。我希望您会收到一个错误,与IPv4上的错误相同。也许微软在IPv6中做了一些改变。无论是ping
还是curl
还是Chrome都没有连接到IPv6,但Go确实如此。
http://[::]:1709