提交 681409f2 编写于 作者: A alanb

7132924: (dc) DatagramChannel.disconnect throws SocketException with IPv4...

7132924: (dc) DatagramChannel.disconnect throws SocketException with IPv4 socket and IPv6 enabled [macosx]
Reviewed-by: chegar
上级 5d4a2d0d
...@@ -744,7 +744,8 @@ class DatagramChannelImpl ...@@ -744,7 +744,8 @@ class DatagramChannelImpl
if (sm != null) if (sm != null)
sm.checkConnect(isa.getAddress().getHostAddress(), sm.checkConnect(isa.getAddress().getHostAddress(),
isa.getPort()); isa.getPort());
disconnect0(fd); boolean isIPv6 = (family == StandardProtocolFamily.INET6);
disconnect0(fd, isIPv6);
remoteAddress = null; remoteAddress = null;
state = ST_UNCONNECTED; state = ST_UNCONNECTED;
...@@ -1079,7 +1080,7 @@ class DatagramChannelImpl ...@@ -1079,7 +1080,7 @@ class DatagramChannelImpl
private static native void initIDs(); private static native void initIDs();
private static native void disconnect0(FileDescriptor fd) private static native void disconnect0(FileDescriptor fd, boolean isIPv6)
throws IOException; throws IOException;
private native int receive0(FileDescriptor fd, long address, int len, private native int receive0(FileDescriptor fd, long address, int len,
......
...@@ -77,7 +77,7 @@ Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz) ...@@ -77,7 +77,7 @@ Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz)
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this, Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
jobject fdo) jobject fdo, jboolean isIPv6)
{ {
jint fd = fdval(env, fdo); jint fd = fdval(env, fdo);
int rv; int rv;
...@@ -94,7 +94,7 @@ Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this, ...@@ -94,7 +94,7 @@ Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
#ifdef AF_INET6 #ifdef AF_INET6
if (ipv6_available()) { if (isIPv6) {
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa; struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa;
#if defined(_ALLBSD_SOURCE) #if defined(_ALLBSD_SOURCE)
him6->sin6_family = AF_INET6; him6->sin6_family = AF_INET6;
......
...@@ -108,7 +108,7 @@ jboolean purgeOutstandingICMP(JNIEnv *env, jclass clazz, jint fd) ...@@ -108,7 +108,7 @@ jboolean purgeOutstandingICMP(JNIEnv *env, jclass clazz, jint fd)
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this, Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
jobject fdo) jobject fdo, jboolean isIPv6)
{ {
jint fd = fdval(env, fdo); jint fd = fdval(env, fdo);
int rv = 0; int rv = 0;
......
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
* @bug 7132924
* @summary Test DatagramChannel.disconnect when DatagramChannel is connected to an IPv4 socket
* @run main Disconnect
* @run main/othervm -Djava.net.preferIPv4Stack=true Disconnect
*/
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.io.IOException;
public class Disconnect {
public static void main(String[] args) throws IOException {
// test with default protocol family
try (DatagramChannel dc = DatagramChannel.open()) {
test(dc);
test(dc);
}
// test with IPv4 only
try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
test(dc);
test(dc);
}
}
/**
* Connect DatagramChannel to a server, write a datagram and disconnect. Invoke
* a second or subsequent time with the same DatagramChannel instance to check
* that disconnect works as expected.
*/
static void test(DatagramChannel dc) throws IOException {
try (DatagramChannel server = DatagramChannel.open()) {
server.bind(new InetSocketAddress(0));
InetAddress lh = InetAddress.getLocalHost();
dc.connect(new InetSocketAddress(lh, server.socket().getLocalPort()));
dc.write(ByteBuffer.wrap("hello".getBytes()));
ByteBuffer bb = ByteBuffer.allocate(100);
server.receive(bb);
dc.disconnect();
try {
dc.write(ByteBuffer.wrap("another message".getBytes()));
throw new RuntimeException("write should fail, not connected");
} catch (NotYetConnectedException expected) {
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册