int main(int argc, char** argv)
{
    CmdLineParser clp;
    loadCmdLine(clp);

    ConfigInput input;
    if(!parseCommandLine(argc, argv, clp, input))
    {
        return 1;
    }

    setupSignalHandling();

    //
    // Create and Initialize the SocketHandler and MessageHandler
    //
    SocketHandler *server = new TcpSocketHandlerImpl(input.listenPort, input.ipAddress);
    MessageHandler *msgHandler = new EchoServerTcpMessageHandler();
    msgHandler->setDebug(input.isVerbose);
    server->setMessageHandler(msgHandler);
    server->setHandlerMode(SocketHandler::MODE_SERVER);
    server->setDebug(input.isVerbose);

    if(!server->initialize())
    {
        cerr << "Error Initializing the SocketServer, exiting";
        return 1;
    }
    SOCKET_SERVER = server;

    //
    // Run the Echo Server
    // It will be stopped by a SIGINT (CTRL-C) signal
    //
    server->run(); // This call blocks
    cout << "Server stopped" << endl;

    delete server;
    delete msgHandler;

    return 0;
}