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

时间:2016-10-20 21:00:12

标签: erlang udp broadcast otp

首先让我说我不确定这是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}选项的情况下,Socket的地址为{0,0,0,0}。 via inet:sockname(Socket)。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

要获取广播数据包,必须将套接字绑定到broadcast address例如,如果要在常规UNIX设置中将接口广播到接口lo,则可以将Address设置为{127,255,255,255}

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