summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/Network.java
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2012-10-17 01:34:32 +0200
committerJose <jose@zeroc.com>2012-10-17 01:34:32 +0200
commit00f67f18a6f4f099adac116dbc634a0bd2a0dea6 (patch)
tree0f0ad214e4f0f59e9ef9543145541c24769258c4 /java/src/IceInternal/Network.java
parentMinor fix (diff)
downloadice-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.java44
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)
{