| /* |
| * Copyright (c) 2003, 2010, 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 4868820 |
| * @summary IPv6 support for Windows XP and 2003 server |
| */ |
| |
| import java.net.*; |
| import java.io.*; |
| |
| public class TcpTest extends Tests { |
| static ServerSocket server, server1, server2; |
| static Socket c1, c2, c3, s1, s2, s3; |
| static InetAddress s1peer, s2peer; |
| |
| static InetAddress ia4any; |
| static InetAddress ia6any; |
| static Inet6Address ia6addr; |
| static Inet4Address ia4addr; |
| |
| static { |
| ia6addr = getFirstLocalIPv6Address (); |
| ia4addr = getFirstLocalIPv4Address (); |
| try { |
| ia4any = InetAddress.getByName ("0.0.0.0"); |
| ia6any = InetAddress.getByName ("::0"); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| public static void main (String[] args) throws Exception { |
| checkDebug(args); |
| if (ia6addr == null) { |
| System.out.println ("No IPV6 addresses: exiting test"); |
| return; |
| } |
| dprintln ("Local Addresses"); |
| dprintln (ia4addr.toString()); |
| dprintln (ia6addr.toString()); |
| test1 (0); |
| test1 (5100); |
| test2(); |
| test3(); |
| test4(); |
| } |
| |
| /* basic TCP connectivity test using IPv6 only and IPv4/IPv6 together */ |
| |
| static void test1 (int port) throws Exception { |
| server = new ServerSocket (port); |
| if (port == 0) { |
| port = server.getLocalPort(); |
| } |
| // try Ipv6 only |
| c1 = new Socket ("::1", port); |
| s1 = server.accept (); |
| simpleDataExchange (c1, s1); |
| s1.close (); |
| c1.close(); |
| // try with both IPv4 and Ipv6 |
| c1 = new Socket ("127.0.0.1", port); |
| c2 = new Socket ("::1", port); |
| s1 = server.accept(); |
| s2 = server.accept(); |
| s1peer = s1.getInetAddress(); |
| s2peer = s2.getInetAddress(); |
| if (s1peer instanceof Inet6Address) { |
| t_assert ((s2peer instanceof Inet4Address)); |
| simpleDataExchange (c2, s1); |
| simpleDataExchange (c1, s2); |
| } else { |
| t_assert ((s2peer instanceof Inet6Address)); |
| simpleDataExchange (c1, s1); |
| simpleDataExchange (c2, s2); |
| } |
| c1.close(); |
| c2.close(); |
| s1.close(); |
| s2.close(); |
| server.close (); |
| System.out.println ("Test1: OK"); |
| } |
| |
| /** bind tests: |
| * 1. bind to specific address IPv4 only (any port) |
| * 2. bind to specific address IPv6 only (any port) |
| * 3. bind to specific address IPv4 only (specific port) |
| * 4. bind to specific address IPv4 only (specific port) |
| * 5. bind to any address IPv4 (test collision) |
| */ |
| |
| static void test2 () throws Exception { |
| |
| server = new ServerSocket (); |
| InetSocketAddress sadr = new InetSocketAddress (ia4addr, 0); |
| server.bind (sadr); |
| dprintln ("server bound to " + sadr); |
| int port = server.getLocalPort(); |
| InetSocketAddress sadr6 = new InetSocketAddress (ia6addr, port); |
| |
| c1 = new Socket (ia4addr, port); |
| try { |
| dprintln ("connecting to " + ia6addr); |
| c2 = new Socket (); |
| c2.connect (sadr6, 1000); |
| throw new RuntimeException ("connect to IPv6 address should be refused"); |
| } catch (IOException e) { } |
| server.close (); |
| c1.close (); |
| |
| /* now try IPv6 only */ |
| |
| server = new ServerSocket (); |
| sadr = new InetSocketAddress (ia6addr, 0); |
| dprintln ("binding to " + sadr); |
| server.bind (sadr); |
| port = server.getLocalPort(); |
| |
| c1 = new Socket (ia6addr, port); |
| try { |
| c2 = new Socket (ia4addr, port); |
| throw new RuntimeException ("connect to IPv4 address should be refused"); |
| } catch (IOException e) { } |
| server.close (); |
| c1.close (); |
| |
| /* now try IPv6 specific port only */ |
| |
| server = new ServerSocket (); |
| sadr = new InetSocketAddress (ia6addr, 5200); |
| server.bind (sadr); |
| port = server.getLocalPort(); |
| t_assert (port == 5200); |
| |
| c1 = new Socket (ia6addr, port); |
| try { |
| c2 = new Socket (ia4addr, port); |
| throw new RuntimeException ("connect to IPv4 address should be refused"); |
| } catch (IOException e) { } |
| server.close (); |
| c1.close (); |
| |
| /* now try IPv4 specific port only */ |
| |
| server = new ServerSocket (); |
| sadr = new InetSocketAddress (ia4addr, 5200); |
| server.bind (sadr); |
| port = server.getLocalPort(); |
| t_assert (port == 5200); |
| |
| c1 = new Socket (ia4addr, port); |
| |
| try { |
| c2 = new Socket (ia6addr, port); |
| throw new RuntimeException ("connect to IPv6 address should be refused"); |
| } catch (IOException e) { } |
| server.accept().close(); |
| c1.close (); |
| server.close(); |
| System.out.println ("Test2: OK"); |
| } |
| |
| /* Test timeouts on accept(), connect() */ |
| |
| static void test3 () throws Exception { |
| server = new ServerSocket (0); |
| server.setSoTimeout (5000); |
| int port = server.getLocalPort(); |
| long t1 = System.currentTimeMillis(); |
| try { |
| server.accept (); |
| throw new RuntimeException ("accept should not have returned"); |
| } catch (SocketTimeoutException e) {} |
| t1 = System.currentTimeMillis() - t1; |
| checkTime (t1, 5000); |
| |
| c1 = new Socket (); |
| c1.connect (new InetSocketAddress (ia4addr, port), 1000); |
| s1 = server.accept (); |
| simpleDataExchange (c1,s1); |
| c2 = new Socket (); |
| c2.connect (new InetSocketAddress (ia6addr, port), 1000); |
| s2 = server.accept (); |
| simpleDataExchange (c2,s2); |
| c3 = new Socket (); |
| c3.connect (new InetSocketAddress (ia6addr, port), 1000); |
| s3 = server.accept (); |
| c2.close (); s2.close(); |
| server.close(); |
| simpleDataExchange (c3,s3); |
| c1.close (); c2.close(); |
| s1.close (); s2.close(); |
| |
| System.out.println ("Test3: OK"); |
| } |
| |
| /* Test: connect to IPv4 mapped address */ |
| |
| static void test4 () throws Exception { |
| server = new ServerSocket (0); |
| int port = server.getLocalPort(); |
| |
| /* create an IPv4 mapped address corresponding to local host */ |
| |
| byte[] b = {0,0,0,0,0,0,0,0,0,0,(byte)0xff,(byte)0xff,0,0,0,0}; |
| byte[] ia4 = ia4addr.getAddress(); |
| b[12] = ia4[0]; |
| b[13] = ia4[1]; |
| b[14] = ia4[2]; |
| b[15] = ia4[3]; |
| |
| InetAddress dest = InetAddress.getByAddress (b); |
| c1 = new Socket (dest, port); |
| s1 = server.accept (); |
| simpleDataExchange (c1,s1); |
| c1.close (); |
| s1.close (); |
| server.close (); |
| System.out.println ("Test4: OK"); |
| } |
| } |