【问题标题】:Erlang gen_udp not recieving broadcast when {ip,Address} specificed on Socket当在 Socket 上指定 {ip,Address} 时,Erlang gen_udp 未接收广播
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 所以我必须使用两个套接字,这并不理想但仍然可以使用。 {broadcast, true} 选项似乎仅用于从未接收的套接字发送广播信息。我用两个套接字修改了我的代码,一个用于处理广播接收,另一个用于处理正常通信。有用。谢谢!
猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2018-04-05
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多