【问题标题】:Sending UDP packet to everybody in a LAN?向局域网中的每个人发送 UDP 数据包?
【发布时间】:2013-07-01 00:45:53
【问题描述】:

有没有办法在局域网内发送一个 UDP 数据包,以便每台机器都能接收到它? (当然不能保证,因为它的 UDP)。

比如,发送一个请求“你好,有人在吗?”然后监听响应?

我在发送和接收方面没有问题,只是想知道除了尝试每个 IP 地址之外是否还有其他方法......

编辑:这是我目前使用的:

...
multicastSocket = new MulticastSocket();
multicastSocket.setBroadcast(true);
broadcastGroup = InetAddress.getByName("255.255.255.255");
// multicastSocket.joinGroup(broadcastGroup);
...

最后一行代码被注释掉,因为它抛出了一个异常。现在我读到将数据包发送到 255.255.255.255 是“多年来不推荐使用的”,并且很可能无法在许多 LAN 上工作。另外,我不确定我是否需要MulticastSocket 或者普通的DatagramSocket 是否也可以。但无论如何,现在发送 UDP 广播的首选方式是什么?

【问题讨论】:

  • 255.255.255.255 不是有效的多播组地址,您加入多播组不是为了发送给他们,而是从他们那里接收。您需要决定您正在做什么:广播或多播。它们不是一回事。
  • 我总是倾向于寻求最简单的解决方案。如果您在 C 类子网上,我建议您简单地向同一子网上的所有 253 台其他主机发送单播。哎呀,即使是B级,为什么不呢?它只有大约 65,000 个目的地。
  • @wookie919 “为什么不”?因为路由器可能不支持?
  • 我只想向局域网中的每台计算机发送一个广播数据包。我的解决方案适用于此,但我可以用 Datagram 替换 Multicast,可以吗?所以对于我的问题,我根本不需要关心多播,因为我只想发送,对吧?好的,所以我只是更换插座,它是“固定的”。然而:现在广播的首选方式是什么?听说IPv6根本不支持广播?这会成为问题吗?
  • @EJP: 不能支持65K单播数据包的路由器?我想你误会了我。 AyCe:广播/多播的问题在于它依赖路由器/交换机为您完成工作。基本上,您所做的是将单个数据包注入网络并依靠网络为每个可用主机复制数据包。如果您可以控制网络,那么通过 IP 发送带有广播目标地址的 UDP 就可以了。如果不是,那么向所有 IP 地址发送单播有什么问题?至少这种方法可以保证在任何网络中都能正常工作。

标签: java networking udp


【解决方案1】:

嗯,我自己发现的:

只需打开一个MulticastSocket 并在 224.0.0.0 和 239.255.255.255 之间的任何 IP 上使用 joinGroup。当然,与该多播组相关的所有内容都需要在同一个多播 IP 上接收。 我这样做是为了发送和接收,但是,我认为你只在接收消息时才需要它。当您想向 IP 组中的每个人广播数据包时,只需将其发送到您选择的 IP。

您还应该使用setBroadcast(true); 以允许对某些 (?) 系统进行广播。

【讨论】:

  • 如果组中有 3 台主机,例如,他们会加入组 241.3.3.7 吗?然后一个主机会向 ​​241.3.3.7 发送一个数据包,它会到达所有监听 241.3.3.7 的主机?
  • @RenegadeAndy 没错,只是 241.*.*.* 不在支持的范围内。
【解决方案2】:

从技术上讲,您实际上需要广播消息。基本上你需要MulticastSocket,这种套接字在客户端用于监听服务器广播给多个客户端的数据包。

这里是帮助您实现这一目标的 java 教程:

http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html

【讨论】:

  • 我正在使用新的 MulticastSocket();现在使用 setBroadcast(true);。由于我不想接收而只想发送消息,这似乎可行,对于我使用的目标地址 InetAddress.getByName("255.255.255.255");所有侦听端口的应用程序我发送它以接收它。 multicastSocket.joinGroup(addr);抛出一个异常,但它也可以正常工作......
  • 答案不正确。广播时不需要MulticastSocket。它是用于,错误的,多播。再说一次,它们不是一回事。您引用的链接措辞不正确:它是关于多播,而不是广播。我已经报错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2014-07-14
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
相关资源
最近更新 更多