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[]) {
// 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 version " << VERSION << " (revisión " << rev
+ << ")." << endl;
+ cout << "Modo de uso: " << argv[0] << " [planta] [puerto]" << endl;
// Acepta argumentos.
string filename = "planta.xml";
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) {
// 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;
}