]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
Se pasa la conexion suicida al finish del TCPServer para que sea 'transparente'.
authorLeandro Lucarella <llucax@gmail.com>
Sun, 23 Nov 2003 21:04:08 +0000 (21:04 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 23 Nov 2003 21:04:08 +0000 (21:04 +0000)
Server/include/plaqui/server/runnable.h
Server/include/plaqui/server/tcpserver.h
Server/src/server.cpp
Server/src/tcpserver.cpp

index 51480a0b68ab987615b9ddd13c53e352a8018b79..b1d169d3323109926a0e40b48f10a881cf130f84 100644 (file)
@@ -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 (<em>thread</em>) 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
index 2e3fb6ab4a11b6160d19c70f67222bbf5b5d57a6..66fe3be524a141f88e4f60f3d7b8222039b28c7c 100644 (file)
@@ -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.
index e332866d37954f4b22da97a9dbb3b3c1ae976d41..b0d40d31b23e27a2d99a9a5e954de9cc9f35246a 100644 (file)
@@ -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 desc=\"El server se apagará en instantes...\" />");
-                       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,
                                        "<response desc=\"Invalid command for 'server' taget!\" />");
index 8b1c3bb571c996a7ba72070b5ac7928b86a3b258..d85490c78bce214e1edcf45b7f75b4bc0b24adab 100644 (file)
@@ -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