代码之家  ›  专栏  ›  技术社区  ›  AndreKR

为什么http。获取(“http://[:]:1234”)工作?

ip go
  •  2
  • AndreKR  · 技术社区  · 8 年前

    我正在编写一个测试,希望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.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", ":0")

    对于 "http://" + listener.Addr().String() 它打印:

    http://[::]:1709
    

    据我所知,“括号冒号冒号括号”是指“所有接口”。

    令我惊讶的是 http.Get("http://[::]:1709") 工作时,它连接到Web服务器并打印“foo”。

    “情况如何” http://[::]:1709 “有效地址?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Michael Hampton    8 年前

    至少在Linux系统上,这会导致连接到localhost。

    地址 :: IN6ADDR_ANY ,通常用于侦听与系统上任何IPv6地址的连接。这类似于 INADDR_ANY ,也称为 0.0.0.0 在IPv4中。

    偶尔有人会尝试使用其中一个地址作为传出连接的目标地址。发生这种情况时:

    当建立到的传出连接时 0.0.0.0 ,Linux实际上从 127.0.0.1 127.0.0.1

    类似地,在与 :: ,Linux实际上从 ::1 ::1 。以下是一个示例,摘自我的一个网站(碰巧是一个IP地址查找工具):

    [error@murloc ~]$ curl -k -H "Host: myip.addr.space" https://[::]:8443/
    ::1
    

    为完整起见,以下是IPv4版本:

    [error@murloc ~]$ curl -k -H "Host: myip.addr.space" https://0.0.0.0:8443/
    127.0.0.1
    

    请注意,这是特定于操作系统的。你会收到 an error on Windows