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

Java 为什么DatagramSocket不使用多播地址通过网络发送?,java,sockets,networking,multicast,Java,Sockets,Networking,Multicast,下面的代码只在本地为我工作。我可以在同一台机器上的另一个程序中接收它。我在wireshark(窗口)中看不到任何流量。如果我将多播地址更改为现有地址,如10.10.10.10,那么我会在wireshark中看到UDP数据包 在wireshark中,我使用过滤器udp.port==5353。我可以看到多播地址的其他数据包,我认为我的wireshark设置是正确的 防火墙已禁用 public static void main( String[] args ) throws Exception {

下面的代码只在本地为我工作。我可以在同一台机器上的另一个程序中接收它。我在wireshark(窗口)中看不到任何流量。如果我将多播地址更改为现有地址,如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环回适配器für KM-TEST)。如果我移除环回适配器,它就会工作。在另一个系统上,有一个VMware适配器,它可能会产生问题

为什么数据包没有发送到所有网络适配器?如何将其发送到正确的适配器?

224.0.0/24是:

本地网络控制块(224.0.0/24)

本地网络控制块中的地址用于协议 控制未在链路外转发的通信量


您不能使用它。

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

地址范围介于224.0.0.0和224.0.0.255之间(含224.0.0.255), 保留用于路由协议和其他低级别 拓扑发现或维护协议,如网关发现 和集团成员报告多播路由器不应转发 目标地址在此范围内的任何多播数据报, 无论其TTL如何。

资料来源:IANA-


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

发送单播数据报时,路由表规定使用哪个网络接口发送数据包。对于多播,您需要指定接口。您可以使用
多播套接字
实现这一点

假设要发送的接口的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) );
}

你的网络设置是什么?什么是网络掩码?@BoristheSpider请看我的编辑。是的,这是多播地址的范围。@Horcrux7否,这是多播地址的本地网络控制块子范围的范围。这是多播DNS的地址。但这是另一个话题,与问题无关@你不能引用维基百科来对抗RFC。和。如果您试图使用MDN,您需要找到一种设置MAC地址的方法,而这在Java中是无法做到的。@EJP设置MAC地址意味着什么?它现在可以工作了。@EJP您更喜欢像Wikipedia那样的RFC,然后看看这里,如果接口不是到多播地址范围的默认路由,您只需要指定接口。@EJP对于多播,通常没有默认路由。@dbush谢谢,我现在将它发送到每个有效的网络接口,它就可以工作了。我仍然对将套接字绑定到所需接口的地址没有帮助这一事实感到困惑。您必须使用
setNetworkInterface
setInterface
选择发送多播数据报的接口。