import java.nio.channels.*;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.List;


public class exhaust_socket {
    public static void main(String args[]) throws Exception {
        long timespan;
        if(args.length == 0) {
            timespan = 10 * 1000;
        } else {
            timespan = Long.valueOf(args[0]) * 1000; // in second
        }
        
        List<ServerSocketChannel> servers = new ArrayList<ServerSocketChannel>();
        List<SocketChannel> clients = new ArrayList<SocketChannel>();

        boolean reuse_address = true;
        for(int i = 0; i < 200000000; i++) {
            try {
                if(reuse_address) {
                    Thread.sleep(5);
                    ServerSocket socket = new ServerSocket();
                    socket.setReuseAddress(true);
                    socket.bind(null);
                    socket.close();
                    if(i%50 == 0) {
                        System.out.println("loop: " + i);
                    }
                } else {
                    ServerSocketChannel server = ServerSocketChannel.open();
                    servers.add(server);
                    server.socket().bind(null);
                    SocketChannel client = SocketChannel.open();
                    client.configureBlocking(false);
                    client.connect(server.socket().getLocalSocketAddress());
                }
            } catch(java.net.BindException ignore) {
                System.out.println("BindException caught!!!" + i);
            }
        }
        Thread.sleep(timespan);
    }
}
