我有以下问题:
我想发送多播数据到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"));
据我所知,你应该使用接受SocketAddress
的MulticastSocket
构造函数,传递一个SocketAddress
实例,该实例由你想使用的接口的IP地址构造。