首页 > 解决方案 > Elixir/Erlang: :ssl.start 在使用 {:reuseaddr, true} 在不同的 IP 上启动时返回 {:error, :already_listening}

问题描述

我需要在主机的同一端口上的不同 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_listen} 不匹配

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

标签: erlangelixir

解决方案


这是一个 Erlang Bug。该问题在 OTP 23.3 中得到解决。

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


推荐阅读