X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/bb95c06ba5fa63ab90ee148ab8a6e009226a53cf..1855f998e5c0e51e2c1958724ac84cc13a87d84c:/Server/src/main.cpp?ds=sidebyside diff --git a/Server/src/main.cpp b/Server/src/main.cpp index 1f505ee..8940921 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; @@ -51,17 +52,29 @@ void on_finished(void) { server = NULL; } +void on_signal(int signal) { + switch (signal) { + case SIGINT: + case SIGTERM: + case SIGQUIT: + if (server) { + server->finish(); + } + break; + } +} + int main(int argc, char* argv[]) { // Termina con mas informacion si hay una excepcion no manejada. - set_terminate (__gnu_cxx::__verbose_terminate_handler); + set_terminate(__gnu_cxx::__verbose_terminate_handler); // Bienvenida. cout << "PlaQui Server. Modo de uso: " << endl; cout << "\t" << 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,12 +89,21 @@ 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); } catch (const sockerr& e) { cerr << "Socket Error: " << e.operation() << " | serrno = " << e.serrno() << " | errstr = " << e.errstr() << endl; + if (e.serrno() == 98) { + cerr << "No se puede usar el puerto " << port << " porque ya está " + "siendo utilizado por otro programa." << endl; + } if (e.io()) { cerr << "Es: non-blocking and interrupt io recoverable error." << endl; @@ -112,16 +134,23 @@ 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)); + // Corre el server. - server->run(false); + server->run(); // Espera a que el server se muera. while (server) { - Glib::usleep(1000000); + //cerr << "-----------------\n\nAHHHHHHH\n\n----------------" << endl; + Glib::usleep(100000); // 0,1 segundos } + // Espera un segundo más por las dudas, para asegurarse de que terminó. + Glib::usleep(1000000); // 1 segundo // Como no detachee el server, lo tengo que eliminar a mano. //delete server; return 0; } +