【问题标题】:error when trying to assign local address value尝试分配本地地址值时出错
【发布时间】:2021-06-22 00:59:14
【问题描述】:

我正在尝试像这样设置 http 请求的本地地址:

localAddr, err := net.ResolveIPAddr("ip6", laddr)

if err != nil {
    log.Fatal(err)
}

localTCPAddr := net.TCPAddr{
    IP: localAddr.IP,
}

client := &http.Client{
    Transport: &http.Transport{
        Proxy: http.ProxyFromEnvironment,
        DialContext: (&net.Dialer{
            LocalAddr: &localTCPAddr,
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            DualStack: true,
        }).DialContext,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
    },
}

供参考:laddr 变量如下所示:

 2620:13a:c020:0016:1f7b:169c:846f:218a:49152

尝试发送请求时发生错误,这是错误: 2018/11/25 00:17:58 查找 2620:13a:c020:0016:1f7b:169c:846f:218a:49152:没有这样的主机。

我不确定是什么导致了这个错误。关于我的环境的一些细节:它是一个全新的 Ubuntu VPS,几乎没有安装任何东西。

编辑: 即使如下所示删除端口,我仍然会收到此错误: dial tcp [2620:13a:c020:16:1f7b:169c:846f:218a]:0 ->[remoteip]:[remoteport] 绑定:无法分配请求的地址

【问题讨论】:

  • 2620:13a:c020:0016:1f7b:169c:846f:218a:49152 不是有效的 IPV6。例如,2001:4860:4860::8888 是有效的 IPV6
  • 49152 是端口,不是地址@Ehsan.Saradar 的明确部分
  • 那就是写不正确。为避免混淆,IPv6 地址应放在括号中,即[2620:13a:c020:0016:1f7b:169c:846f:218a]:49152。您的程序需要做所有其他程序所做的事情,并在尝试在DialContext 中使用它之前解析出地址。 net.SplitHostPort() 会为你做这件事。

标签: go networking ipv6


【解决方案1】:

2620:13a:c020:0016:1f7b:169c:846f:218a:49152 不是有效的 IPv6 地址。你有一个额外的49152,它甚至不是一个有效的 IPv6 hextet。这个2620:13a:c020:0016:1f7b:169c:846f:218a 是一个有效的 IPv6 地址。

Validator

编辑

地址解析与建立连接不同。如果您想建立连接而不是解析地址,那就是您需要端口的时间。

例如

net.Dial("tcp", "[2620:13a:c020:16:1f7b:169c:846f:218a]:49152")

【讨论】:

  • @robert 在 cmets 中提到,49152 是端口吗?如果是这样,请将其删除,因为解析 IP 地址时不需要端口。
  • 是的,是端口。但是,删除时我遇到了这个问题: dial tcp [2620:13a:c020:16:1f7b:169c:846f:218a]:0 (my IP, from port 0?) -> [different ip, remote i think] bind : 无法分配请求的地址
  • 把,你移植到括号后面net.Dial("tcp", "[2620:13a:c020:16:1f7b:169c:846f:218a]:49152")
  • 那么我应该在上面的代码中添加到哪里?在解析 IP 和在拨号功能中设置它之间没有添加它的“空间”。另外,我不确定我是否正在互通,但我不一定要设置端口,我宁愿自动设置。但是,如果我不设置端口,它将默认为 :0 并在那里引发不同的错误。
  • 修订:我明白你的意思。但是,我想为客户端设置本地地址字段,让 net/http 处理实际连接和端口。但由于某种原因,端口为 0,然后会因此而恐慌:绑定:无法分配请求的地址
【解决方案2】:

我的错误是:我之前没有将地址分配给接口。感谢您告知我有关端口的信息,非常感谢。

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多