/* * Copyright (c) 2010, 2021, 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 6213702 * @summary OOB data causes a SocketChannel, with OOBINLINE disabled, to be selected
*/
// OOB data should be received
test(s, true, 0, 0, sel);
test(s, true, 512, 0, sel);
test(s, true, 0, 512, sel);
test(s, true, 512, 512, sel);
} finally { if (sel != null) sel.close(); if (sc != null) sc.close(); if (ssc != null) ssc.close(); if (s != null) sc.close();
}
}
staticvoid test(Socket s, boolean urgentExpected, int bytesBefore, int bytesAfter,
Selector sel) throws IOException
{ // send data int bytesExpected = 0; if (bytesBefore > 0) {
s.getOutputStream().write(newbyte[bytesBefore]);
bytesExpected += bytesBefore;
}
s.sendUrgentData(0xff); if (urgentExpected)
bytesExpected++; if (bytesAfter > 0) {
s.getOutputStream().write(newbyte[bytesAfter]);
bytesExpected += bytesAfter;
}
// receive data, checking for spurious wakeups and reads int spuriousWakeups = 0; int spuriousReads = 0; int bytesRead = 0;
ByteBuffer bb = ByteBuffer.allocate(100); for (;;) { int n = sel.select(2000); if (n == 0) { if (bytesRead == bytesExpected) {
System.out.format("Selector wakeups %d\tSpurious reads %d%n",
spuriousWakeups, spuriousReads); return;
} if (++spuriousWakeups >= 3) thrownew RuntimeException("Selector appears to be spinning" + " or data not received"); continue;
} if (n > 1) thrownew RuntimeException("More than one key selected????");
SelectionKey key = sel.selectedKeys().iterator().next();
bb.clear();
n = ((SocketChannel)key.channel()).read(bb); if (n == 0) { if (++spuriousReads >=3) thrownew RuntimeException("Too many spurious reads");
} else {
bytesRead += n; if (bytesRead > bytesExpected) thrownew RuntimeException("Received more than expected");
}
sel.selectedKeys().clear();
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.