зеркало из https://github.com/mono/ikvm-fork.git
Implemented SocketOptions.IP_MULTICAST_IF and SocketOptions.IP_MULTICAST_IF2.
This commit is contained in:
Родитель
9a945fa059
Коммит
864fe01019
|
@ -628,16 +628,25 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
|
||||||
break;
|
break;
|
||||||
case SocketOptions.IP_MULTICAST_IF:
|
case SocketOptions.IP_MULTICAST_IF:
|
||||||
{
|
{
|
||||||
NetworkInterface netIf = (NetworkInterface)val;
|
InetAddress addr = (InetAddress)val;
|
||||||
Enumeration e = netIf.getInetAddresses();
|
netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface), (int)PlainSocketImpl.getAddressFromInetAddress(addr).get_Address());
|
||||||
if (e.hasMoreElements())
|
|
||||||
{
|
|
||||||
netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastInterface), (int)PlainSocketImpl.getAddressFromInetAddress((InetAddress)e.nextElement()).get_Address());
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SocketOptions.IP_MULTICAST_IF2:
|
case SocketOptions.IP_MULTICAST_IF2:
|
||||||
throw new SocketException("SocketOptions.IP_MULTICAST_IF2 not implemented");
|
{
|
||||||
|
NetworkInterface netIf = (NetworkInterface)val;
|
||||||
|
Enumeration e = netIf.getInetAddresses();
|
||||||
|
while (e.hasMoreElements())
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new SocketException("No IPv4 address found on interface");
|
||||||
|
}
|
||||||
case SocketOptions.IP_MULTICAST_LOOP:
|
case SocketOptions.IP_MULTICAST_LOOP:
|
||||||
netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastLoopback), ((Boolean)val).booleanValue() ? 1 : 0);
|
netSocket.SetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastLoopback), ((Boolean)val).booleanValue() ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
@ -658,6 +667,18 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
|
||||||
throw new SocketException("Socket is closed");
|
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
|
private Object socketGetOption(int opt) throws SocketException
|
||||||
{
|
{
|
||||||
|
@ -670,9 +691,12 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
|
||||||
case SocketOptions.SO_BROADCAST:
|
case SocketOptions.SO_BROADCAST:
|
||||||
return CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.Socket), SocketOptionName.wrap(SocketOptionName.Broadcast))) != 0;
|
return CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.Socket), SocketOptionName.wrap(SocketOptionName.Broadcast))) != 0;
|
||||||
case SocketOptions.IP_MULTICAST_IF:
|
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:
|
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:
|
case SocketOptions.IP_MULTICAST_LOOP:
|
||||||
return CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastLoopback))) != 0;
|
return CIL.unbox_int(netSocket.GetSocketOption(SocketOptionLevel.wrap(SocketOptionLevel.IP), SocketOptionName.wrap(SocketOptionName.MulticastLoopback))) != 0;
|
||||||
case SocketOptions.SO_REUSEADDR:
|
case SocketOptions.SO_REUSEADDR:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче