为什么 DatagramSocket 不通过网络发送多播地址?

Why a DatagramSocket does not send over the network with multicast address?

以下代码仅对我在本地有效。我可以在同一台机器上的另一个程序中接收它。我在 wireshark 中看不到任何流量(在 Windows 上)。如果我将多播地址更改为现有地址,如 10.10.10.10,那么我会在 wireshark 中看到 UDP 数据包。

在 wireshark 中,我使用过滤器 udp.port == 5353。我可以看到一些其他数据包到多播地址,我认为我的 wireshark 设置是正确的。

防火墙已禁用。

public static void main( String[] args ) throws Exception {
    byte[] buf = "some data".getBytes();
    DatagramSocket socket = new DatagramSocket();
    InetAddress address = InetAddress.getByName( "224.0.0.251" );
    socket.send( new DatagramPacket( buf, buf.length, address, 5353 ) );
}

编辑:原因似乎是环回适配器(Microsoft Loopbackadapter für KM-TEST)。如果我删除环回适配器然后它工作。在另一个系统上有一个 VMware 适配器,它会产生一个 equals 问题。

为什么数据包没有发送到所有网络适配器?我怎样才能将它发送到正确的适配器?

224.0.0/24 是 reserved:

Local Network Control Block (224.0.0/24)

Addresses in the Local Network Control Block are used for protocol control traffic that is not forwarded off link.

你不能使用它。

@EJP 是正确的。您不能将该地址用作多播地址。

The range of addresses between 224.0.0.0 and 224.0.0.255, inclusive, is reserved for the use of routing protocols and other low-level topology discovery or maintenance protocols, such as gateway discovery and group membership reporting. Multicast routers should not forward any multicast datagram with destination addresses in this range, regardless of its TTL.

资料来源:IANA - IPv4 Multicast Address Space Registry

换句话说,您选择的多播地址不应该工作,即使它在多播地址范围内。

发送单播数据报时,路由表规定使用哪个网络接口发送数据包。对于多播,您需要指定接口。您可以使用 MulticastSocket.

假设你要发送的接口IP是10.10.10.1,你会做如下操作:

public static void main( String[] args ) throws Exception {
    byte[] buf = "some data".getBytes();
    MulticastSocket socket = new MulticastSocket();
    socket.setNetworkInterface(NetworkInterface.getByInetAddress(
                                 InetAddress.getByName( "10.10.10.1" )));
    InetAddress address = InetAddress.getByName( "224.0.0.251" );
    socket.send( new DatagramPacket( buf, buf.length, address, 5353) );
}