Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2008-03-14 12:14:37 +0300
committerjfrijters <jfrijters>2008-03-14 12:14:37 +0300
commit864fe01019100482f77d758990f156f82a92c37f (patch)
treeff4bad02812011d6987909983402e2baf7ea2aea /openjdk/java/net
parent9a945fa059a9a1da53f7eafa740381700e69e0fe (diff)
Implemented SocketOptions.IP_MULTICAST_IF and SocketOptions.IP_MULTICAST_IF2.
Diffstat (limited to 'openjdk/java/net')
-rw-r--r--openjdk/java/net/PlainDatagramSocketImpl.java38
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: