diff options
Diffstat (limited to 'external/ikvm/runtime/openjdk/sun.nio.ch.cs')
-rw-r--r-- | external/ikvm/runtime/openjdk/sun.nio.ch.cs | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/external/ikvm/runtime/openjdk/sun.nio.ch.cs b/external/ikvm/runtime/openjdk/sun.nio.ch.cs index c13544934e..7b5258fa99 100644 --- a/external/ikvm/runtime/openjdk/sun.nio.ch.cs +++ b/external/ikvm/runtime/openjdk/sun.nio.ch.cs @@ -34,7 +34,7 @@ static class Java_sun_nio_ch_DatagramChannelImpl { } - public static void disconnect0(FileDescriptor fd) + public static void disconnect0(FileDescriptor fd, bool isIPv6) { #if !FIRST_PASS try @@ -120,15 +120,14 @@ static class Java_sun_nio_ch_DatagramChannelImpl #endif } - public static int send0(object obj, bool preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len, object sa) + public static int send0(object obj, bool preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len, InetAddress addr, int port) { #if FIRST_PASS return 0; #else - java.net.InetSocketAddress addr = (java.net.InetSocketAddress)sa; try { - return fd.getSocket().SendTo(buf, pos, len, System.Net.Sockets.SocketFlags.None, new System.Net.IPEndPoint(java.net.SocketUtil.getAddressFromInetAddress(addr.getAddress(), preferIPv6), addr.getPort())); + return fd.getSocket().SendTo(buf, pos, len, System.Net.Sockets.SocketFlags.None, new System.Net.IPEndPoint(java.net.SocketUtil.getAddressFromInetAddress(addr, preferIPv6), port)); } catch (System.Net.Sockets.SocketException x) { @@ -409,7 +408,14 @@ namespace IKVM.NativeCode.sun.nio.ch } catch (System.Net.Sockets.SocketException x) { - throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x); + if (x.ErrorCode == global::java.net.SocketUtil.WSAEWOULDBLOCK) + { + count = 0; + } + else + { + throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x); + } } catch (ObjectDisposedException) { @@ -469,7 +475,14 @@ namespace IKVM.NativeCode.sun.nio.ch } catch (System.Net.Sockets.SocketException x) { - throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x); + if (x.ErrorCode == global::java.net.SocketUtil.WSAEWOULDBLOCK) + { + count = 0; + } + else + { + throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x); + } } catch (ObjectDisposedException) { @@ -507,6 +520,13 @@ namespace IKVM.NativeCode.sun.nio.ch && Environment.OSVersion.Version.Major >= 6; } + public static int isExclusiveBindAvailable() + { + return Environment.OSVersion.Platform == PlatformID.Win32NT + ? Environment.OSVersion.Version.Major >= 6 ? 1 : 0 + : -1; + } + public static bool canIPv6SocketJoinIPv4Group0() { return false; @@ -971,11 +991,16 @@ namespace IKVM.NativeCode.sun.nio.ch #endif } - public static void bind0(bool preferIPv6, FileDescriptor fd, InetAddress addr, int port) + public static void bind0(FileDescriptor fd, bool preferIPv6, bool useExclBind, InetAddress addr, int port) { #if !FIRST_PASS try { + if (useExclBind) + { + // TODO enable this after we merge OpenJDK 7u40 + //global::java.net.net_util_md.setExclusiveBind(fd.getSocket()); + } fd.getSocket().Bind(new System.Net.IPEndPoint(global::java.net.SocketUtil.getAddressFromInetAddress(addr, preferIPv6), port)); } catch (System.Net.Sockets.SocketException x) |