【问题标题】:IPv6 Resolution in gen_tcp connect when called from Elixir从 Elixir 调用时 gen_tcp connect 中的 IPv6 解析
【发布时间】:2022-02-04 08:03:12
【问题描述】:

当使用gen_tcpconnect方法时,会自动解析IPv4域,即:

:gen_tcp.connect('google.com', 443, [:binary, active: false])
{:ok, #Port<0.116>}

但是,如果解析 IPv6 域,它将无法正确解析

iex(production@b7726c04)3> :gen_tcp.connect('ipv6.google.com', 443, [:binary, active: false])
{:error, :nxdomain}

我是否缺少带有:gen_tcp.connect 套接字选项的选项,该选项将启用 IPv6 解析,或者我是否在使用前自己手动解析了域?即类似:

:inet_res.resolve('ipv6.google.com', :in, :aaaa)

{:ok,
 {:dns_rec, {:dns_header, 1, true, :query, false, false, true, true, false, 0},
  [{:dns_query, 'ipv6.google.com', :aaaa, :in, false}],
  [
    {:dns_rr, 'ipv6.google.com', :cname, :in, 0, 604606, 'ipv6.l.google.com',
     :undefined, [], false},
    {:dns_rr, 'ipv6.l.google.com', :aaaa, :in, 0, 300,
     {9220, 26624, 16387, 3072, 0, 0, 0, 101}, :undefined, [], false},
    {:dns_rr, 'ipv6.l.google.com', :aaaa, :in, 0, 300,
     {9220, 26624, 16387, 3072, 0, 0, 0, 102}, :undefined, [], false},
    {:dns_rr, 'ipv6.l.google.com', :aaaa, :in, 0, 300,
     {9220, 26624, 16387, 3072, 0, 0, 0, 113}, :undefined, [], false},
    {:dns_rr, 'ipv6.l.google.com', :aaaa, :in, 0, 300,
     {9220, 26624, 16387, 3072, 0, 0, 0, 100}, :undefined, [], false}
  ], [], []}}

然后直接使用 IPv6 元组:

:gen_tcp.connect({9220, 26624, 16387, 3072, 0, 0, 0, 101}, 443, [:binary, active: false])
{:ok, #Port<0.138>}

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    你可以使用inet6:

    {ok, P} = gen_tcp:connect("ipv6.google.com", 80, [inet6]).
    {ok,#Port<0.14>}
    

    【讨论】:

    • 如此明显!我确实必须调整连接配置以适应 Elixir,:gen_tcp.connect('ipv6.google.com', 443, [:inet6, :binary, active: false])
    猜你喜欢
    • 2018-06-01
    • 2014-05-18
    • 2012-05-14
    • 2011-02-27
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多