/** @file * \brief Header de la clase Server * \author Imanol Barba Sabariego * \date 11/06/2013 * * En este fichero se define la clase Server y algunos métodos globales usados por ésta para la gestión de threads y otros aspectos. */ #ifndef SERVER_H_ #define SERVER_H_ #include "Socket.h" #include "SocketException.h" #include #include #include #include #include #include //! Numero de conexiones permitidas activas (en espera o activas) /*! Esta constante controla cuantas conexiones puede haber en espera o cuantas puede haber establecias en cualquier momento: habrá N activas y N en espera como mucho, no N en espera o activas. */ #define N 5 //! Ruta a la llave privada /*! Ruta relativa o absoluta a la llave privada RSA, si no existe o es inválida, se creará una nueva en esa localización. */ #define PRIVATEKEY "bin/private.key" //! Ruta a la llave pública /*! Ruta relativa o absoluta a la llave pública RSA, si no existe o es inválida, se creará una nueva en esa localización. */ #define PUBLICKEY "bin/public.key" //! Ruta al fichero de configuración /*! Ruta relativa o absoluta al fichero de configuración, de no existir o ser inválido el programa no funcionará. */ #define CONFFILE "socket.conf" //! Nombre del socket del módulo de control /*! Nombre y ruta del socket UNIX del módulo de control */ using namespace std; //! Clase de aplicación servidor /** Esta clase define un objeto con los métodos y atributos necesarios para lanzar una aplicación servidor y atender las conexiones. Para realizar la comunicación con el cliente, usa un objeto de la clase Socket */ class Server { private: //! Contador de threads /*! Esta variable se encarga de mantener la cuenta de threads activos, por tanto, el número de conexiones que estan siendo antendidas simultáneamente. */ int nWorkers; //! Variable de apagado /*! Esta variable controla el apagado del servidor, al ponerla a true, la siguiente iteración del bucle que atiende las conexiones no se producirá y el programa terminará. */ bool shutdownServer; //! Contador de ID de thread /*! Esta variable contiene el ID del próximo thread que se creará, por tanto, indica el número de conexiones que han sido atendidas desde el inicio del servidor */ int workerID; //! Pila de threads terminados /*! Esta variable contiene una lista de threads que han finalizado su ejecución. A cada iteración del bucle que atiende conexiones, se libera toda la memoria de los threads que hay almacenados aquí. */ list stoppedThreads; //! Pila de threads empezados /*! \brief Esta variable contiene una lista de threads que han empezado su ejecución. Si el programa finalizara prematuramente, se liberarían los punteros de los threads almacenados en esta pila. __NOTA: No se liberará la memoria asignada a los argumentos de los threads, dando lugar a memory leaks; sin embargo, esto se produciria al finalizar el programa, por tanto no es relevante.__ */ list startedThreads; //! Socket de comunicación /*! Esta variable contiene el objeto de la clase Socket que la aplicación servidor usa para poder atender las peticiones. Su función es quedarse escuchando el el puerto e IP introducidas en el fichero de configuración y crear un objeto de la clase Socket para cada petición de cada cliente nuevo, siendo este último objeto creado el que se usa para la comuncación. */ Socket ss; public: //! Constructor de la clase Server /*! Incializa los argumentos inciales del servidor */ Server() : nWorkers(0), workerID(0), shutdownServer(false) {} //! Getter del número de threads activos /*! Devuelve el número de threads activos en ese instante, por tanto, del número de conexiones que están siendo atendidas. */ int getNWorkers(); //! Setter del número de threads activos /*! Establece el número de threads activos, para poder cambiarlo cuando alguno de los threads activos finaliza */ void setNWorkers(int n /*!* getStartedThreads(); //! Getter de la pila de threads terminados /*! Devuelve un contenedor con la lista de threads que han terminado, para poder liberar la memoria que se le ha asignado */ list* getStoppedThreads(); //! Método de inicialización del servidor /*! Incializa el servidor en el puerto e IP especificados para empezar a recibir conexiones entrantes */ void startServer(string i /*! *threadList/*!