import std.stdio;
import std.getopt;
import std.socket;

void main(string[] args) {
   string hostname = "localhost";
   ushort port = 2525;
   getopt(args, "host", &hostname, "port", &port);

   auto listener = new Socket(AddressFamily.INET, SocketType.STREAM);
   listener.bind(new InternetAddress(hostname, port));
   listener.listen(10);
   auto readSet = new SocketSet();
   Socket[] connectedClients;
   char[1024] buffer;
   bool isRunning = true;
   while(isRunning) {
       readSet.reset();
       readSet.add(listener);
       foreach(client; connectedClients) readSet.add(client);
       if(Socket.select(readSet, null, null)) {
           foreach(client; connectedClients)
               if(readSet.isSet(client)) {
                   // read from it and echo it back
                   auto got = client.receive(buffer);
                   client.send(buffer[0 .. got]);
               }
           if(readSet.isSet(listener)) {
               // the listener is ready to read, that means
               // a new client wants to connect. We accept it here.
               auto newSocket = listener.accept();
               writeln("Connection opened");
               newSocket.send("Hello!\n"); // say hello
               newSocket.close();
               writeln("Connection closed");
               //connectedClients ~= newSocket; // add to our list
           }
       }
   }
}