编程语言
首页 > 编程语言> > java-为什么DatagramSocket不通过多播地址通过网络发送?

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

作者:互联网

以下代码仅对我本地有效.我可以在另一个程序的同一台计算机上接收它.我在Wireshk中看不到任何流量(在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 LoopbackadapterfürKM-TEST).如果我删除回送适配器,那么它将起作用.在另一个系统上,有一个VMware适配器可能会产生平等问题.

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

解决方法:

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

标签:sockets,networking,java,multicast
来源: https://codeday.me/bug/20191118/2028876.html