net / http不能使用ipv6地址

时间:2018-10-24 11:56:11

标签: go

我正在尝试向本地ipv6地址(通过mdns发现)发出“ GET”请求。问题是请求fails。这是为什么?

package main

import (
    "fmt"
    "net/http"
)

func main() {
    url := "http://[fe80::cf5:b02f:27c3:2abe]:7070/kw/"
    rsp, err := http.Get(url)
    fmt.Println(rsp, err)
}

输出

<nil> Get http://[fe80::cf5:b02f:27c3:2abe]:7070/kw/: dial tcp [fe80::cf5:b02f:27c3:2abe]:7070: socket: Unknown protocol

1 个答案:

答案 0 :(得分:1)

您正在尝试连接到IPv6链接本地地址,但是这些地址要求作用域ID有效。作用域ID通常是接口名称或接口编号(例如,在Linux上是enp4s0wlp5s0;在Windows上是312)。

%也需要转义,因为它出现在URL中。因此它将显示为%25

因此您的网址应显示为:

url := "http://[fe80::cf5:b02f:27c3:2abe%25interface]:7070/kw/"

interface是您的作用域ID。


还请注意,尽管net/http会很高兴地向IPv6链接本地地址文字发出HTTP请求,但Web浏览器不会。但是,它们将连接到名称,这些名称将解析为范围合理的链接本地地址。它们还将连接到全局(和ULA)IPv6地址文字。如果您最终将在项目中使用Web浏览器,请记住这一点。