Elixir/Erlang: :ssl.start returns {:error, :already_listening} 使用 {:reuseaddr, true} 在不同的 IP 上启动时

Elixir/Erlang: :ssl.start returns {:error, :already_listening} when starting on different IPs using {:reuseaddr, true}

我需要在主机的同一端口上的不同 IP 上打开两个 DTLS 套接字。 使用 :gen_udp{:reuseaddr, true} 它工作正常。 但不是 :ssl.listen

您可以使用以下命令重现它:

sudo ip addr add ::2 dev lo

然后在iex

:ssl.start

{:ok, socket} = :ssl.listen(20_100, [
  :binary,
  :inet6,
  {:active, true},
  {:reuseaddr, true},
  {:protocol, :dtls},
  {:ip, {0, 0, 0, 0, 0, 0, 0, 1}}
])

{:ok, socket2} = :ssl.listen(20_100, [
  :binary,
  :inet6,
  {:active, true},
  {:reuseaddr, true},
  {:protocol, :dtls},
  {:ip, {0, 0, 0, 0, 0, 0, 0, 2}}
])

最后的 :ssl.listen 与 {:error, :already_listening}

不匹配

我如何使用 :ssl.listen:reuseaddr 选项在不同的 IP 地址上启动两个 DTLS 套接字主机的相同端口?

如果是 IPV6,::1/128 是默认分配给环回接口 lo 的唯一地址。

您还需要将 ::2/128 分配给环回接口。那么第二个 :ssl:listen() 就可以了

这是一个 Erlang 错误。该问题已在 OTP 23.3 中解决。

https://github.com/erlang/otp/issues/4375