]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/main.cpp
Se agrega un try para tratar de solucionar situaciones en las que el server
[z.facultad/75.42/plaqui.git] / Server / src / main.cpp
index 89409213e63ae028c90d025b79bd33f402a53e62..d0e630c4838762e5e91539508544d5525afebf6b 100644 (file)
@@ -40,28 +40,37 @@ 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 (server) {
+                       if (!called && server) {
+                               cout << "Terminando servidor... " << flush;
                                server->finish();
                        }
                        break;
        }
+       called = true;
 }
 
 int main(int argc, char* argv[]) {
@@ -69,9 +78,14 @@ 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 versión " << VERSION << " (revisión " << rev
+               << ")." << endl;
+       cout << "Modo de uso: " << argv[0] << " [planta] [puerto]" << endl;
 
        // Acepta argumentos.
        string filename = "planta.xml";
@@ -96,28 +110,17 @@ int main(int argc, char* argv[]) {
 
        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.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;
-               } 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;
+               } 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) {
@@ -137,19 +140,24 @@ int main(int argc, char* argv[]) {
        // 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();
+       cout << "Atendiendo conexiones en el puerto " << port << "." << endl;
 
        // Espera a que el server se muera.
        while (server) {
-               //cerr << "-----------------\n\nAHHHHHHH\n\n----------------" << endl;
-               Glib::usleep(100000); // 0,1 segundos
+               Glib::usleep(500000); // 0,5 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;
 }