aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralanb <none@none>2010-06-18 16:16:51 +0100
committeralanb <none@none>2010-06-18 16:16:51 +0100
commit8a0ea780bec19d8cd7bcf6496037e8922218327f (patch)
tree8c9daec3ef082bb4dadc42dee7565d2fbb347ee0
parent2aaa08eb8de9cf0ffb7f6d53004ce116293860bb (diff)
4981129: (dc) DatagramSocket created by DatagramChannel does not provide sender info
Reviewed-by: chegar
-rw-r--r--src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java17
-rw-r--r--test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java6
2 files changed, 15 insertions, 8 deletions
diff --git a/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java b/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java
index da54a3d64..a59488814 100644
--- a/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java
+++ b/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java
@@ -171,10 +171,9 @@ public class DatagramSocketAdaptor
// Must hold dc.blockingLock()
//
- private void receive(ByteBuffer bb) throws IOException {
+ private SocketAddress receive(ByteBuffer bb) throws IOException {
if (timeout == 0) {
- dc.receive(bb);
- return;
+ return dc.receive(bb);
}
// Implement timeout with a selector
@@ -183,8 +182,9 @@ public class DatagramSocketAdaptor
dc.configureBlocking(false);
try {
int n;
- if (dc.receive(bb) != null)
- return;
+ SocketAddress sender;
+ if ((sender = dc.receive(bb)) != null)
+ return sender;
sel = Util.getTemporarySelector(dc);
sk = dc.register(sel, SelectionKey.OP_READ);
long to = timeout;
@@ -194,8 +194,8 @@ public class DatagramSocketAdaptor
long st = System.currentTimeMillis();
int ns = sel.select(to);
if (ns > 0 && sk.isReadable()) {
- if (dc.receive(bb) != null)
- return;
+ if ((sender = dc.receive(bb)) != null)
+ return sender;
}
sel.selectedKeys().remove(sk);
to -= System.currentTimeMillis() - st;
@@ -222,7 +222,8 @@ public class DatagramSocketAdaptor
ByteBuffer bb = ByteBuffer.wrap(p.getData(),
p.getOffset(),
p.getLength());
- receive(bb);
+ SocketAddress sender = receive(bb);
+ p.setSocketAddress(sender);
p.setLength(bb.position() - p.getOffset());
}
} catch (IOException x) {
diff --git a/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java b/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java
index 561d7ead4..5a855acbd 100644
--- a/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java
+++ b/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java
@@ -22,6 +22,7 @@
*/
/* @test
+ * @bug 4313882 4981129
* @summary Unit test for datagram-socket-channel adaptors
* @library ..
*/
@@ -93,6 +94,11 @@ public class AdaptDatagramSocket {
if (ip.getData()[ip.getOffset() + i]
!= op.getData()[op.getOffset() + i])
throw new Exception("Incorrect data received");
+
+ if (!(ip.getSocketAddress().equals(dst))) {
+ throw new Exception("Incorrect sender address, expected: " + dst
+ + " actual: " + ip.getSocketAddress());
+ }
}
static void test(InetSocketAddress dst,