如何告诉Java使用哪个接口发送多播数据



我有以下问题:

我想发送多播数据到f.i 224.0.12.13,但由于用户的机器可能有很多设备,数据(显然)被发送到具有最小度量的路由。例如,route print"Windows告诉我:

===========================================================================
Schnittstellenliste
38...00 15 5d 25 b1 ec ......Hyper-V Virtual Ethernet Adapter
33...3e 37 86 8b cd 0d ......Microsoft Wi-Fi Direct Virtual Adapter #4
47...3c 37 86 8b cd 0d ......Microsoft Wi-Fi Direct Virtual Adapter #5
7...3c 37 86 8b cd 0d ......NETGEAR A6150 WiFi USB 2.0 Adapter
1...........................Software Loopback Interface 1
===========================================================================
IPv4-Routentabelle
===========================================================================
Aktive Routen:
Netzwerkziel    Netzwerkmaske          Gateway    Schnittstelle Metrik
0.0.0.0          0.0.0.0     192.168.10.1    192.168.10.49     35
127.0.0.0        255.0.0.0   Auf Verbindung         127.0.0.1    331
127.0.0.1  255.255.255.255   Auf Verbindung         127.0.0.1    331
127.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    331
172.18.64.0    255.255.240.0   Auf Verbindung       172.18.64.1    271
172.18.64.1  255.255.255.255   Auf Verbindung       172.18.64.1    271
172.18.79.255  255.255.255.255   Auf Verbindung       172.18.64.1    271
192.168.10.0    255.255.255.0   Auf Verbindung     192.168.10.49    291
192.168.10.49  255.255.255.255   Auf Verbindung     192.168.10.49    291
192.168.10.255  255.255.255.255   Auf Verbindung     192.168.10.49    291
224.0.0.0        240.0.0.0   Auf Verbindung         127.0.0.1    331
224.0.0.0        240.0.0.0   Auf Verbindung     192.168.10.49    291
224.0.0.0        240.0.0.0   Auf Verbindung       172.18.64.1    271
255.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    331
255.255.255.255  255.255.255.255   Auf Verbindung     192.168.10.49    291
255.255.255.255  255.255.255.255   Auf Verbindung       172.18.64.1    271
===========================================================================

可以看到,有三条224.0.0.0路由。Java通常选择172.16.64.1 net/device中的地址,而不是理想的192.168.10.49

在我的代码中,我知道应该用来发送多播数据的设备的名称和IP。

但是我怎样才能克服操作系统,选择一个度量最小的呢?

改变度量不是一个选项。在发送组播数据时,必须能够告诉java使用哪个接口,而不是借助路由表进行选择。

有人能帮忙吗?

在wireshark的帮助下测试发送和观察哪个接口的代码片段:

int port = 5000;
String group = "224.0.23.13";

final MulticastSocket s = new MulticastSocket();
byte[] buf = new byte[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) i;
}

final DatagramPacket pack = new DatagramPacket(buf, buf.length, InetAddress.getByName(group), port);
s.send(pack);

正确的方法是使用setNetworkInterface方法,该方法为组播数据报设置出网络接口。

MulticastSocket s = new MulticastSocket();
s.setNetworkInterface(NetworkInterface.getByName("192.168.10.49"));

据我所知,你应该使用接受SocketAddressMulticastSocket构造函数,传递一个SocketAddress实例,该实例由你想使用的接口的IP地址构造。

相关内容

  • 没有找到相关文章

最新更新