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