2016-10-20 36 views
2

首先让我说,我不知道的状态,如果这是一个OSX问题,或者我离开出来的东西不recieving广播:二郎gen_udp时{IP,地址} specificed Socket的

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

问题:当{IP,地址}选项中指定gen_udp

接口适配器,但是它的工作原理,当我不使用{IP,地址}选项无法按预期接收广播消息。我收到发送到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}。通过inet:sockname(Socket)。

我在想什么?

+0

当插座绑定到0.0.0.0它将从任何接口接收。你确定当你使用{ip,Address}时,数据包被发送到你绑定的接口吗? –

+0

当我使用wireshark并选择了目标接口({ip,Address}的接口)时,我可以看到广播信息包。所以我假设数据包正在发送并到达接口。如预期的那样,它们出现在wireshark目的地为255.255.255.255的地方,这与Address不同。所以我认为它们被忽略或者没有被socket处理,因为它们不匹配。当我不使用{ip,Address}但Socket接收数据时,我看到了同样的情况。 – casillic

回答

1

为了获得广播包,你必须绑定套接字连接到broadcast address例如,如果你想获得广播接口lo在一般的UNIX设置,您可以设置Address{127,255,255,255}

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

所以我必须使用两个插座,这并不理想,但仍然可行。 {broadcast,true}选项似乎仅用于从未收到的套接字发送广播信息。我用两个套接字修改了我的代码,一个处理广播接收,另一个处理正常通信。有用。谢谢! – casillic