From 289cd57714db01c97f3fa7cb65efedf30114919f Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sun, 23 Nov 2003 21:04:08 +0000 Subject: [PATCH] Se pasa la conexion suicida al finish del TCPServer para que sea 'transparente'. --- Server/include/plaqui/server/runnable.h | 2 +- Server/include/plaqui/server/tcpserver.h | 2 +- Server/src/server.cpp | 21 +++++++-------------- Server/src/tcpserver.cpp | 23 +++++++++++++++-------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Server/include/plaqui/server/runnable.h b/Server/include/plaqui/server/runnable.h index 51480a0..b1d169d 100644 --- a/Server/include/plaqui/server/runnable.h +++ b/Server/include/plaqui/server/runnable.h @@ -38,7 +38,7 @@ namespace Server { /** * Objeto cuya función principal es realizar una tarea puntual. * - * Esta el la clase base para todos objetos que realizan una tarea, ya sea + * Esta es la clase base para todos objetos que realizan una tarea, ya sea * en un hilo (thread) propio o no. Al tener esta flexibilidad hay * dos formas típicas de usarlo cuyo punto en común es implementar una * subclase (ya que esta clase es abstracta) y sobreescribir el método diff --git a/Server/include/plaqui/server/tcpserver.h b/Server/include/plaqui/server/tcpserver.h index 2e3fb6a..66fe3be 100644 --- a/Server/include/plaqui/server/tcpserver.h +++ b/Server/include/plaqui/server/tcpserver.h @@ -129,7 +129,7 @@ namespace Server { * \note Para saber cuando la tarea fue finalizada puede utilizar * la señal signal_finished(). */ - //virtual void finish(void); + virtual void finish(void); /** * Se encarga de borrar una conexión de la lista cuando finaliza. diff --git a/Server/src/server.cpp b/Server/src/server.cpp index e332866..b0d40d3 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -121,22 +121,15 @@ void Server::on_control_command_received(const Command& command, if (command.get_command() == "status") { response = cmd_server_status(); } else if (command.get_command() == "stop") { - finish(); response = new HTTPResponse(HTTPMessage::OK, ""); - response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; - controlserver->send(*response); - delete response; - // Creo una conexión suicida para que el accept() del server retorne - // el control y el server pueda terminar realmente. - try { - sockinetbuf suicida(sockbuf::sock_stream); - suicida.connect(socket.localhost(), socket.localport()); - } catch (...) { - // FIXME - signal_error().emit(12345, "ahhhh! no puedo crear conexion suicida"); - } - return; + // XXX - Sin mandar la respuesta enseguida podría ser que el server + // cierre la conexión antes de mandar la respuesta. + //response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; + //controlserver->send(*response); + //delete response; + finish(); + //return; } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, ""); diff --git a/Server/src/tcpserver.cpp b/Server/src/tcpserver.cpp index 8b1c3bb..d85490c 100644 --- a/Server/src/tcpserver.cpp +++ b/Server/src/tcpserver.cpp @@ -86,17 +86,24 @@ TCPServer::TCPServer(const Connection::Port& port) throw(sockerr): #endif // DEBUG } -/*void TCPServer::finish(bool attach) { +void TCPServer::finish(void) { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" - << ": finish(attach = " << attach << ");" << endl; + << ": finish(void);" << endl; #endif // DEBUG - //socket_mutex.lock(); - close(socket.sd()); - //socket.shutdown(sockbuf::shut_readwrite); - //socket_mutex.unlock(); - Runnable::finish(attach); -}*/ + Runnable::finish(); + // Creo una conexión suicida para que el accept() del server retorne + // el control y el server pueda terminar realmente. + try { + sockinetbuf suicida(sockbuf::sock_stream); + suicida.connect(socket.localhost(), socket.localport()); + } catch (const sockerr& e) { + // FIXME + signal_error().emit(100000 + e.serrno(), string("No se pudo crear " + "conexión 'suicida' para terminar el servidor: ") + + e.errstr()); + } +} void TCPServer::on_connection_finished(Connection* connection) { #ifdef DEBUG -- 2.43.0