]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/main.cpp
Se pone mas prolijo el tema de la respuesta.
[z.facultad/75.42/plaqui.git] / Server / src / main.cpp
index 1f505eef20a2a520d2dcf8bc38e32ecfc409ea82..89409213e63ae028c90d025b79bd33f402a53e62 100644 (file)
@@ -32,6 +32,7 @@
 #include <glibmm/timer.h>
 #include <iostream>
 #include <exception>
 #include <glibmm/timer.h>
 #include <iostream>
 #include <exception>
+#include <csignal>
 
 using namespace std;
 using namespace PlaQui::Server;
 
 using namespace std;
 using namespace PlaQui::Server;
@@ -51,17 +52,29 @@ void on_finished(void) {
        server = NULL;
 }
 
        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.
 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.
 
        // 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.
        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();
 
        // 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;
        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;
                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 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.
        // Corre el server.
-       server->run(false);
+       server->run();
 
        // Espera a que el server se muera.
        while (server) {
 
        // 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;
 }
 
        // Como no detachee el server, lo tengo que eliminar a mano.
        //delete server;
 
        return 0;
 }
+