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

时间:2016-06-14 13:05:11

标签: java sockets networking multicast

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

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

防火墙已被禁用。

while(1){
            digitalWrite(EN1, HIGH);
            digitalWrite(IN1, HIGH);
            digitalWrite(IN2, LOW);
            delay(10000);

            digitalWrite(EN1, LOW);
            delay(5000);

            digitalWrite(EN1, HIGH);
            digitalWrite(IN1, HIGH);
            digitalWrite(IN2, LOW);
            delay(10000);

            digitalWrite(EN1, LOW);
            delay(5000);
    }

编辑:原因似乎是环回适配器(MicrosoftLoopbackadapterfürKM-TEST)。如果我删除环回适配器然后它工作。在另一个系统上有一个VMware适配器,它可以产生一个平等的问题。

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

3 个答案:

答案 0 :(得分:1)

224.0.0 / 24是reserved

  

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

     

本地网络控制块中的地址用于协议      控制未通过链接转发的流量。

你无法使用它。

答案 1 :(得分:1)

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

  

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

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

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

答案 2 :(得分:1)

发送单播数据报时,路由表指示使用哪个网络接口发送数据包。对于多播,您需要指定接口。您可以使用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) );
}