当在 Socket 上指定 {ip,Address} 时,Erlang gen_udp 没有接收到广播

Erlang gen_udp not recieving broadcast when {ip,Address} specificed on Socket

首先让我声明,我不确定这是 OSX 问题还是我遗漏了什么:

目标我需要指定一个接口适配器用于UDP通信,以避免与使用相同端口的其他软件发生冲突。 (将有 2 个网络适配器)。

问题:在 gen_udp

中使用 {ip,Address} 选项指定接口适配器时无法接收广播消息

但是当我不使用 {ip,Address} 选项时它按预期工作。我收到发送到 255.255.255.255 或 192.168.1.255(均有效)的广播消息。

{ok,Socket} = gen_udp:open(Port,[{broadcast, true},{reuseaddr, true}]).

一旦我添加了 {ip,Address} 选项来指定要使用的接口适配器,它就会停止接收广播。我可以通过 wireshark 看到消息,但套接字没有收到它们。

{ok,Socket} = gen_udp:open(Port,[{broadcast, true},{reuseaddr, true},{ip,Address}]).

我注意到在没有使用 {ip,Address} 选项的情况下,套接字的地址为 {0,0,0,0}。通过 inet:sockname(Socket).

我错过了什么??

为了获取广播数据包,您必须将套接字绑定到 broadcast address 例如,如果您希望在通用 UNIX 设置中将广播发送到接口 lo,您可以设置 Address{127,255,255,255}:

{ok, IfList} = inet:getifaddrs(),
{_, LoOpts} = proplists:lookup("lo", IfList),
{_, Address} = proplists:lookup(broadaddr, LoOpts)