1 /*
   2  * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.net.*;
  25 import java.io.*;
  26 import java.nio.channels.*;
  27 import java.util.Enumeration;
  28 
  29 /**
  30  * Sanity check Socket/ServerSocket and each of the stream-oriented channels
  31  * on each IP address plumbed to the network adapters.
  32  */
  33 
  34 public class Sanity {
  35     public static void main(String[] args) throws Exception {
  36         Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
  37         while (nifs.hasMoreElements()) {
  38             NetworkInterface ni = nifs.nextElement();
  39             Enumeration<InetAddress> addrs = ni.getInetAddresses();
  40             while (addrs.hasMoreElements()) {
  41                 InetAddress addr = addrs.nextElement();
  42                 test(addr);
  43             }
  44         }
  45     }
  46 
  47     static void test(InetAddress addr) throws Exception {
  48         System.out.println(addr.getHostAddress());
  49 
  50         // ServerSocketChannel.bind
  51         ServerSocketChannel ssc = ServerSocketChannel.open();
  52         try {
  53             ssc.bind(new InetSocketAddress(addr, 0));
  54             int port = ((InetSocketAddress)(ssc.getLocalAddress())).getPort();
  55 
  56             // SocketChannel.connect (implicit bind)
  57             SocketChannel client = SocketChannel.open();
  58             try {
  59                 client.connect(new InetSocketAddress(addr, port));
  60                 SocketChannel peer = ssc.accept();
  61                 try {
  62                     testConnection(Channels.newOutputStream(client),
  63                                    Channels.newInputStream(peer));
  64                 } finally {
  65                     peer.close();
  66                 }
  67             } finally {
  68                 client.close();
  69             }
  70 
  71             // SocketChannel.connect (explicit bind)
  72             client = SocketChannel.open();
  73             try {
  74                 client.bind(new InetSocketAddress(addr, 0))
  75                   .connect(new InetSocketAddress(addr, port));
  76                 ssc.accept().close();
  77             } finally {
  78                 client.close();
  79             }
  80         } finally {
  81             ssc.close();
  82         }
  83 
  84         // AsynchronousServerSocketChannel.bind
  85         AsynchronousServerSocketChannel server =
  86             AsynchronousServerSocketChannel.open();
  87         try {
  88             server.bind(new InetSocketAddress(addr, 0));
  89             int port = ((InetSocketAddress)(server.getLocalAddress())).getPort();
  90 
  91             // AsynchronousSocketChannel.connect (implicit bind)
  92             AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
  93             try {
  94                 client.connect(new InetSocketAddress(addr, port)).get();
  95                 AsynchronousSocketChannel peer = server.accept().get();
  96                 try {
  97                     testConnection(Channels.newOutputStream(client),
  98                                    Channels.newInputStream(peer));
  99                 } finally {
 100                     peer.close();
 101                 }
 102             } finally {
 103                 client.close();
 104             }
 105 
 106             // AsynchronousSocketChannel.connect (explicit bind)
 107             client = AsynchronousSocketChannel.open();
 108             try {
 109                 client.bind(new InetSocketAddress(addr, 0))
 110                   .connect(new InetSocketAddress(addr, port)).get();
 111                 server.accept().get().close();
 112             } finally {
 113                 client.close();
 114             }
 115         } finally {
 116             server.close();
 117         }
 118 
 119         // ServerSocket.bind
 120         ServerSocket ss = new ServerSocket();
 121         try {
 122             ss.bind(new InetSocketAddress(addr, 0));
 123             int port = ss.getLocalPort();
 124 
 125             // Socket.connect (implicit bind)
 126             Socket s = new Socket();
 127             try {
 128                 s.connect(new InetSocketAddress(addr, port));
 129                 Socket peer = ss.accept();
 130                 try {
 131                     testConnection(s.getOutputStream(), peer.getInputStream());
 132                 } finally {
 133                     peer.close();
 134                 }
 135             } finally {
 136                 s.close();
 137             }
 138 
 139             // Socket.connect (explicit bind)
 140             s = new Socket();
 141             try {
 142                 s.bind(new InetSocketAddress(addr, 0));
 143                 s.connect(new InetSocketAddress(addr, port));
 144                 ss.accept().close();
 145             } finally {
 146                 s.close();
 147             }
 148         } finally {
 149             ss.close();
 150         }
 151     }
 152 
 153     static void testConnection(OutputStream out, InputStream in)
 154         throws IOException
 155     {
 156         byte[] msg = "hello".getBytes();
 157         out.write(msg);
 158 
 159         byte[] ba = new byte[100];
 160         int nread = 0;
 161         while (nread < msg.length) {
 162             int n = in.read(ba);
 163             if (n < 0)
 164                 throw new IOException("EOF not expected!");
 165             nread += n;
 166         }
 167     }
 168 }