#include "plaqui/server/connection.h"
#include "plaqui/server/server.h"
+#include "plaqui/server/string.h"
#include <socket++/sockinet.h>
+#include <glibmm/timer.h>
#include <iostream>
-#include <sstream>
#include <exception>
using namespace std;
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 << "Código: " << code << endl;
+ cerr << "Descripción: " << desc << endl;
+ cerr << "--------------------------------------------------------" << endl;
+}
+
+void on_finished(void) {
+ cerr << "Murió el servidor!" << endl;
+ server = NULL;
+}
+
int main(int argc, char* argv[]) {
// Termina con mas informacion si hay una excepcion no manejada.
// Si tiene 2 parámetros.
if (argc > 2) {
// Obtengo puerto.
- stringstream ss(argv[2]);
- ss >> port;
+ to(argv[2], port);
}
}
Glib::thread_init();
try {
- // Corre el server.
- Server server(filename, port);
- server.run(false);
+ // 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;
} else if (e.benign()) {
cerr << "Es: recoverable read/write error like EINTR etc." << endl;
}
+ return e.serrno();
} catch (const exception& e) {
cerr << "Error: " << e.what() << endl;
+ return 1;
} catch (const char* e) {
cerr << "Error: " << e << endl;
+ return 2;
} catch (...) {
cerr << "Error desconocido!" << endl;
+ return 3;
}
+ // Conecto señal para atender errores.
+ server->signal_error().connect(SigC::slot(on_error));
+
+ // Corre el server.
+ server->run(false);
+
+ // Espera a que el server se muera.
+ while (server) {
+ Glib::usleep(1000000);
+ }
+
+ // Como no detachee el server, lo tengo que eliminar a mano.
+ //delete server;
+
return 0;
}