#include <glibmm/timer.h>
#include <iostream>
#include <exception>
+#include <csignal>
using namespace std;
using namespace PlaQui::Server;
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.
// 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;
// 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;
}
+