diff options
author | jfrijters <jfrijters> | 2008-03-14 12:14:37 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2008-03-14 12:14:37 +0300 |
commit | 864fe01019100482f77d758990f156f82a92c37f (patch) | |
tree | ff4bad02812011d6987909983402e2baf7ea2aea /openjdk/java/net | |
parent | 9a945fa059a9a1da53f7eafa740381700e69e0fe (diff) |
Implemented SocketOptions.IP_MULTICAST_IF and SocketOptions.IP_MULTICAST_IF2.
Diffstat (limited to 'openjdk/java/net')
-rw-r--r-- | openjdk/java/net/PlainDatagramSocketImpl.java | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/openjdk/java/net/PlainDatagramSocketImpl.java b/openjdk/java/net/PlainDatagramSocketImpl.java index 9ce1d721..8c7fbbaf 100644 --- a/openjdk/java/net/PlainDatagramSocketImpl.java +++ b/openjdk/java/net/PlainDatagramSocketImpl.java @@ -628,16 +628,25 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl break; case SocketOptions.IP_MULTICAST_IF: { + InetAddress addr = (InetAddress)val; + netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface), (int)PlainSocketImpl.getAddressFromInetAddress(addr).get_Address()); + break; + } + case SocketOptions.IP_MULTICAST_IF2: + { NetworkInterface netIf = (NetworkInterface)val; Enumeration e = netIf.getInetAddresses(); - if (e.hasMoreElements()) + while (e.hasMoreElements()) { - netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface), (int)PlainSocketImpl.getAddressFromInetAddress((InetAddress)e.nextElement()).get_Address()); + InetAddress addr = (InetAddress)e.nextElement(); + if (addr.getAddress().length == 4) + { + netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface), (int)PlainSocketImpl.getAddressFromInetAddress(addr).get_Address()); + return; + } } - break; + throw new SocketException("No IPv4 address found on interface"); } - case SocketOptions.IP_MULTICAST_IF2: - throw new SocketException("SocketOptions.IP_MULTICAST_IF2 not implemented"); case SocketOptions.IP_MULTICAST_LOOP: netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastLoopback), ((Boolean)val).booleanValue() ? 1 : 0); break; @@ -658,6 +667,18 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl throw new SocketException("Socket is closed"); } } + + private static InetAddress getInetAddressFromInt(int addr) throws SocketException + { + try + { + return InetAddress.getByAddress(cli.System.BitConverter.GetBytes(addr)); + } + catch (UnknownHostException x) + { + throw new SocketException(x.getMessage()); + } + } private Object socketGetOption(int opt) throws SocketException { @@ -670,9 +691,12 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl case SocketOptions.SO_BROADCAST: return CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.Socket), SocketOptionName.wrap(SocketOptionName.Broadcast))) != 0; case SocketOptions.IP_MULTICAST_IF: - //return getInetAddressFromInt(CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface)))); + return getInetAddressFromInt(CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface)))); case SocketOptions.IP_MULTICAST_IF2: - throw new SocketException("SocketOptions.IP_MULTICAST_IF(2) not implemented"); + { + NetworkInterface inf = NetworkInterface.getByInetAddress(getInetAddressFromInt(CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface))))); + return inf != null ? inf : new NetworkInterface(null, -1, new InetAddress[] { new Inet4Address() }); + } case SocketOptions.IP_MULTICAST_LOOP: return CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastLoopback))) != 0; case SocketOptions.SO_REUSEADDR: |