【发布时间】: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