X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/e76a2b3254a9ddd5902230ca21c532168d0e93b4..1219cbffa9b305ac8ed53e2bb333443ea3bb1a75:/Server/src/main.cpp diff --git a/Server/src/main.cpp b/Server/src/main.cpp index 7ac8ff4..a18a0a0 100644 --- a/Server/src/main.cpp +++ b/Server/src/main.cpp @@ -32,6 +32,7 @@ #include #include #include +#include using namespace std; using namespace PlaQui::Server; @@ -39,29 +40,55 @@ using namespace PlaQui::Server; Server* server = NULL; void on_error(const Runnable::Error& code, const string& desc) { - cerr << "--------------------------------------------------------" << endl; - cerr << "Error en el servidor:" << endl; + cerr << "ERROR EN EL SERVIDOR" << endl; cerr << "Código: " << code << endl; cerr << "Descripción: " << desc << endl; - cerr << "--------------------------------------------------------" << endl; } void on_finished(void) { - cerr << "Murió el servidor!" << endl; + cout << "Servidor finalizado!" << endl; server = NULL; } +void on_connection_opened(const string& host, const Connection::Port& port) { + cout << "Se abrió una nueva conexión a " << host << ":" << port << "." + << endl; +} + +void on_signal(int signal) { + static bool called = false; + if (!called) { + cout << "Se recibe señal " << signal << "." << endl; + } + switch (signal) { + case SIGINT: + case SIGTERM: + case SIGQUIT: + if (!called && server) { + cout << "Terminando servidor... " << flush; + server->finish(); + } + break; + } + called = true; +} + int main(int argc, char* argv[]) { // Termina con mas informacion si hay una excepcion no manejada. set_terminate(__gnu_cxx::__verbose_terminate_handler); + // Calculo número de revisión. + string rev = "$Rev$"; + rev = rev.substr(6, rev.length() - 8); + // Bienvenida. - cout << "PlaQui Server. Modo de uso: " << endl; - cout << "\t" << argv[0] << " [planta] [puerto]" << endl; + cout << "PlaQui Server version " << VERSION << " (revisión " << rev + << ")." << endl; + cout << "Modo de uso: " << argv[0] << " [planta] [puerto]" << endl; // Acepta argumentos. - string filename = "prueba.xml"; + string filename = "planta.xml"; Connection::Port port = 7522; if (argc > 1) { // Obtengo nombre del archivo de la planta. @@ -76,26 +103,24 @@ int main(int argc, char* argv[]) { // Inicializa threads. Glib::thread_init(); + // Pone un manejador de señales para salir limpiamente del programa. + signal(SIGINT, on_signal); + signal(SIGTERM, on_signal); + signal(SIGQUIT, on_signal); + try { // Crea el server (empieza a escuchar). - server = new Server(filename, port); + server = new Server(port); } catch (const sockerr& e) { cerr << "Socket Error: " << e.operation() << " | serrno = " << e.serrno() << " | errstr = " << e.errstr() << endl; - if (e.io()) { - cerr << "Es: non-blocking and interrupt io recoverable error." - << endl; - } else if (e.arg()) { - cerr << "Es: incorrect argument supplied. recoverable error." - << endl; - } else if (e.op()) { - cerr << "Es: operational error. recovery difficult." << endl; - } else if (e.conn()) { - cerr << "Es: connection error." << endl; - } else if (e.addr()) { - cerr << "Es: address error." << endl; - } else if (e.benign()) { - cerr << "Es: recoverable read/write error like EINTR etc." << endl; + if (e.serrno() == 98) { + cerr << "No se puede usar el puerto " << port << " porque ya está " + "siendo utilizado por otro programa." << endl; + } else { + cerr << "Error al crear el socket: operación: " << e.operation() + << ", código: " << e.serrno() << ", descripción: " + << e.errstr() << endl; } return e.serrno(); } catch (const exception& e) { @@ -112,16 +137,28 @@ int main(int argc, char* argv[]) { // Conecto señal para atender errores. server->signal_error().connect(SigC::slot(on_error)); + // Conecto señal para atender la finalización del server. + server->signal_finished().connect(SigC::slot(on_finished)); + + // Conecto señal para saber cuando se abre una nueva conexión. + server->signal_connection_opened().connect(SigC::slot(on_connection_opened)); + + // Agrego planta. + if (!server->add_plant("default", filename)) { + cerr << "Advertencia: Ya existe una planta llamada 'default'. " + "No se puede agregar la planta almacenada en '" << filename + << "'." << endl; + } + // Corre el server. - server->run(false); + server->run(); + cout << "Atendiendo conexiones en el puerto " << port << "." << endl; // Espera a que el server se muera. while (server) { - Glib::usleep(1000000); + Glib::usleep(500000); // 0,5 segundos } - // Como no detachee el server, lo tengo que eliminar a mano. - //delete server; - return 0; } +