diff options
author | Jose <jose@zeroc.com> | 2012-10-17 01:34:32 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2012-10-17 01:34:32 +0200 |
commit | 00f67f18a6f4f099adac116dbc634a0bd2a0dea6 (patch) | |
tree | 0f0ad214e4f0f59e9ef9543145541c24769258c4 /java/src/IceInternal/Network.java | |
parent | Minor fix (diff) | |
download | ice-00f67f18a6f4f099adac116dbc634a0bd2a0dea6.tar.bz2 ice-00f67f18a6f4f099adac116dbc634a0bd2a0dea6.tar.xz ice-00f67f18a6f4f099adac116dbc634a0bd2a0dea6.zip |
ICE-4856 - Fix multicast for JDK 7 to use MulticastChannel
Diffstat (limited to 'java/src/IceInternal/Network.java')
-rw-r--r-- | java/src/IceInternal/Network.java | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java index e023e182877..6da0808aaaf 100644 --- a/java/src/IceInternal/Network.java +++ b/java/src/IceInternal/Network.java @@ -114,11 +114,51 @@ public final class Network } public static java.nio.channels.DatagramChannel - createUdpSocket() + createUdpSocket(java.net.InetSocketAddress addr) { try { - return java.nio.channels.DatagramChannel.open(); + // + // Use reflection so this code still compiles with older JDK versions. + // java.net.StandardProtocolFamily is new in JDK 1.7 + // + Class<?> c = Util.findClass("java.net.StandardProtocolFamily", null); + if(addr.getAddress().isMulticastAddress() && c != null) + { + // + // For multicast sockets with JDK 7 we must use the open overload that accepts + // ProtocolFamily and specify the ProtocolFamily that corresponds to the address + // type of the multicast groups that the channel will join. + // + String family = "INET"; + if(addr.getAddress() instanceof java.net.Inet6Address) + { + family = "INET6"; + } + java.lang.reflect.Method valueOf = c.getDeclaredMethod("valueOf", new Class<?>[]{String.class}); + + Object[] args = new Object[]{valueOf.invoke(null, new Object[]{family})}; + + java.lang.reflect.Method open = java.nio.channels.DatagramChannel.class.getDeclaredMethod( + "open", new Class<?>[]{Util.findClass("java.net.ProtocolFamily", null)}); + return (java.nio.channels.DatagramChannel)open.invoke(null, args); + } + else + { + return java.nio.channels.DatagramChannel.open(); + } + } + catch(IllegalAccessException ex) + { + throw new Ice.SocketException(ex); + } + catch(java.lang.reflect.InvocationTargetException ex) + { + throw new Ice.SocketException(ex); + } + catch(NoSuchMethodException ex) + { + throw new Ice.SocketException(ex); } catch(java.io.IOException ex) { |