【发布时间】:2017-03-03 01:05:49
【问题描述】:
首先让我声明我不确定这是 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看到消息,但是socket没有收到。
{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 时,它将从任何接口接收。您确定使用 {ip, Address} 时将数据包发送到您绑定的接口吗?
-
当我在选择目标接口({ip,Address}的接口)的情况下使用wireshark时,我可以看到广播信息包。所以我假设数据包正在发送并到达接口。它们按预期出现在wireshark 中,目的地为255.255.255.255,与Address 不同。所以我假设它们被忽略或不被套接字处理,因为它们不匹配。当我不使用 {ip,Address} 但 Socket 接收数据时,我看到了同样的情况。
标签: erlang udp broadcast erlang-otp