]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
- Se sobreescribe el método Connection::finish() para que cierre el socket.
authorLeandro Lucarella <llucax@gmail.com>
Thu, 13 Nov 2003 03:17:08 +0000 (03:17 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 13 Nov 2003 03:17:08 +0000 (03:17 +0000)
- Se elimina el mutex para el socket (comentado por ahora).
- Se implementan rudimentariamente algunos comandos del servidor:
  /server/status, /server/stop, /connection/list.
- Se empieza a implementar el ControlClient, agregando algunas señales que
  probablemente no sean las definitivas.
- Se comienza a implementar la obtención del cuerpo del mensaje en HTTPMessage.
- Se actualiza la documentación.
Seguramente no compila.

17 files changed:
Server/include/plaqui/server/connection.h
Server/include/plaqui/server/controlclient.h
Server/include/plaqui/server/controlserver.h
Server/include/plaqui/server/httpmessage.h
Server/include/plaqui/server/httpresponse.h
Server/include/plaqui/server/tcpserver.h
Server/src/Makefile
Server/src/command.cpp
Server/src/connection.cpp
Server/src/controlclient.cpp
Server/src/controlserver.cpp
Server/src/httpmessage.cpp
Server/src/httprequest.cpp
Server/src/server.cpp
Server/src/tcpserver.cpp
Server/tests/Makefile
docs/server.txt

index 4cdf44b296ef6f794d79c27405897bf999a2e27a..0d7660a1eb236394722c809baee09e6361903bf7 100644 (file)
@@ -38,14 +38,25 @@ namespace Server {
        /// Conexión.
        class Connection: public Runnable {
 
+               // Constantes.
+
                protected:
 
                        /// Tamaño del buffer usado para enviar y recibir datos.
-                       static const int BUFFER_SIZE = 4096;
+                       //static const int BUFFER_SIZE = 4096;
+
+               // Atributos.
+
+               protected:
 
                        /// Socket a usar en la conexión.
                        iosockinet socket;
 
+                       /// Mutex para el socket.
+                       //Glib::Mutex socket_mutex;
+
+               // Métodos.
+
                public:
 
                        /**
@@ -67,6 +78,27 @@ namespace Server {
                         */
                        Connection(sockbuf::type type);
 
+                       /**
+                        * Finaliza la conexión.
+                        *
+                        * \param attach Si es true, la función no retorna hasta que no
+                        *               finalice la tearea (no recomendable).
+                        *
+                        * \note Para saber cuando la tarea fue finalizada puede utilizar
+                        *       la señal signal_finished().
+                        */
+                       virtual void finish(bool attach = false);
+
+                       /**
+                        * Obtiene el nombre del host local de la conexión.
+                        */
+                       std::string get_peerhost(void);
+
+                       /**
+                        * Obtiene el puerto local de la conexión.
+                        */
+                       unsigned get_peerport(void);
+
        };
 
 }
index faf3a275e1c826eca99883e5bb02a34280ebb1e6..6eabc8521ea42fafdc38a5b6a7383526653fbb41 100644 (file)
@@ -38,13 +38,26 @@ namespace Server {
        /// Conexión para enviar comandos de control a una planta.
        class ControlClient: public Connection {
 
+               // Tipos.
+
+               public:
+
+                       /// Tipo de señal para indicar que se recibió una respuesta OK.
+                       typedef SigC::signal0<void> SignalOKReceived;
+
+                       /// Tipo de señal para indicar que se recibió un error.
+                       typedef SigC::signal0<void> SignalErrorReceived;
+
                // Atributos.
 
-               private:
+               protected:
+
+                       /// Señal para indicar que se recibió una respuesta OK.
+                       SignalOKReceived ok_received;
+
+                       /// Señal para indicar que se recibió un error.
+                       SignalErrorReceived error_received;
 
-                       /// Mutex para el socket.
-                       Glib::Mutex socket_mutex;
-                       
                // Métodos.
 
                private:
@@ -70,6 +83,23 @@ namespace Server {
                         */
                        ControlClient(std::string host = "localhost", int port = 7522);
 
+                       /**
+                        * Obtiene la señal para indicar que se recibió una respuesta OK.
+                        */
+                       SignalOKReceived& signal_ok_received(void);
+
+                       /**
+                        * Obtiene la señal para indicar que se recibió un error.
+                        */
+                       SignalErrorReceived& signal_error_received(void);
+
+                       /**
+                        * Envía un comando al servidor.
+                        *
+                        * \param command Comando a enviar.
+                        */
+                       void send(const Command& command);
+
        };
 
 }
index 7c5ea6efbad3085a13dbfa80ebc075ed75d15964..25d122453487eb5ee6345178ea779be8f51f3298 100644 (file)
@@ -41,6 +41,7 @@ namespace Server {
        /// Conexión para recibir comandos de control para una planta.
        class ControlServer: public Connection {
 
+
                // Tipos.
 
                public:
@@ -48,13 +49,11 @@ namespace Server {
                        /// Tipo de señal para indicar que se recibió un comando.
                        typedef SigC::Signal1<void, const Command&> SignalCommandReceived;
 
+
                // Atributos.
 
                private:
 
-                       /// Mutex para el socket.
-                       Glib::Mutex socket_mutex;
-                       
                        /// Señal para indicar que se recibió un comando.
                        SignalCommandReceived command_received;
 
index 730bf0ac861d9a06d09d4a45f6fe6def6dd6a3df..2f6f9578ad6b2accf143e78aae4454a87ef6b2cd 100644 (file)
@@ -45,6 +45,7 @@ namespace Server {
                        /// \todo TODO completar codigos.
                        static const unsigned OK                         = 200;
                        static const unsigned BAD_REQUEST                = 401;
+                       static const unsigned NOT_FOUND                  = 404;
                        static const unsigned LENGTH_REQUIRED            = 411;
                        static const unsigned INTERNAL_SERVER_ERROR      = 500;
                        static const unsigned NOT_IMPLEMENTED            = 501;
index bc8f900a14bda0a2c240fa4a69ae6313e7bc80db..462c0829c879a81ca95e503720bed9ec7353fd37 100644 (file)
@@ -52,7 +52,8 @@ namespace Server {
 
                // Atributos.
 
-               protected:
+               //protected: FIXME - hacer privado con get/set?
+               public:
 
                        /// Código de estado.
                        unsigned status_code;
index 7465faa7a2d0cb9563a29285ade035b3aa3ba3da..1cd344f4da3599eea86ddade2da09cfc7df9783c 100644 (file)
@@ -32,6 +32,7 @@
 #include "plaqui/server/connection.h"
 #include <socket++/sockinet.h>
 #include <list>
+#include <vector>
 
 namespace PlaQui {
 
@@ -57,6 +58,19 @@ namespace Server {
                        /// Lista de conexiones de control.
                        typedef std::list<Connection*> ConnectionList;
 
+               public:
+
+                       /// Información sobre una conexión de contro.
+                       struct ConnectionInfo {
+                               /// Host.
+                               std::string host;
+                               /// Port.
+                               unsigned port;
+                       };
+
+                       /// Lista de información de conexiones de control.
+                       typedef std::vector<ConnectionInfo> ConnectionInfoList;
+
                // Atributos.
 
                private:
@@ -111,6 +125,11 @@ namespace Server {
                         */
                        void on_connection_finished(Connection* connection);
 
+                       /**
+                        * Obtiene una lista conexiones de control abiertas.
+                        */
+                       ConnectionInfoList get_connected(void);
+
        };
 
 }
index 2337cb442dfa3967ea55c5cd537b386e71930b4e..c998e98ae9c69d0518d7521e7ab2d3b58a637029 100644 (file)
@@ -103,7 +103,7 @@ tcpserver_h=$(connection_h) $(INCLUDE_DIR)/tcpserver.h
 objects+=tcpserver.o
 tcpserver.o: $(tcpserver_h) tcpserver.cpp
 
-server_h=$(tcpserver) $(controlserver_h) $(transmitter_h) \
+server_h=$(tcpserver) $(httpresponse_h) $(controlserver_h) $(transmitter_h) \
                 $(INCLUDE_DIR)/server.h
 objects+=server.o
 server.o: $(server_h) server.cpp
index 5448ea6be47c9db393818916d48dfb82d04c8293..2db14f0095aef36f00f3b17c63f0298fcbc30264 100644 (file)
@@ -108,7 +108,7 @@ istream& operator>>(istream& is, Command& command) {
        } else {
                command.target = "";
        }
-       if (command.args.size() > 1) {
+       if (command.args.size() > 0) {
                command.command = command.args[0];
                command.args.erase(command.args.begin());
        } else {
index 408239e45bc206e15016d5f3c4247f3852e8eb0e..1dc6b6d3d9a45d01385021035114312d84aa0194 100644 (file)
@@ -57,6 +57,27 @@ Connection::Connection(sockbuf::type type):
 #endif // DEBUG
 }
 
+void Connection::finish(bool attach) {
+       //socket_mutex.lock();
+       socket->shutdown(sockbuf::shut_readwrite);
+       //socket_mutex.unlock();
+       Runnable::finish(attach);
+}
+
+string Connection::get_peerhost(void) {
+       //socket_mutex.lock();
+       string host = socket->peerhost();
+       //socket_mutex.unlock();
+       return host;
+}
+
+unsigned Connection::get_peerport(void) {
+       //socket_mutex.lock();
+       unsigned port = socket->peerport();
+       //socket_mutex.unlock();
+       return port;
+}
+
 } // namespace Server
 
 } // namespace PlaQui
index 2c76de3efc659f8a9cca22d759bf80de915e6fd6..ffce9c0aa6f15a3f08a200a291160befa0ec8b18 100644 (file)
@@ -48,23 +48,55 @@ ControlClient::ControlClient(string host, int port):
        cerr << __FILE__ << ": host" << host
                << " | port = " << port << endl;
 #endif // DEBUG
-       // FIXME - poner en run().
        socket->connect(host.c_str(), port);
+       if (!socket->is_open()) {
+               throw ios::failure("Can't connect!");
+       }
 }
 
 void ControlClient::real_run(void) {
 #ifdef DEBUG
        cerr << __FILE__ << ": real_run." << endl;
 #endif // DEBUG
+       while (!stop) {
+               HTTPResponse response;
+               try {
+                       //Glib::Mutex::Lock lock(socket_mutex);
+                       socket >> response;
+               // Si se cerró el socket.
+               } catch (const ios::failure& e) {
+                       stop = true;
+                       continue;
+               // Si hay un error al parsear la respuesta.
+               } catch (const HTTPResponse::Error& e) {
 #ifdef DEBUG
-       // FIXME - debería tirar una excepción?
-       if (!socket->is_open()) {
-               cerr << "No se pudo conectar a " << socket->peerhost() <<
-                       ":" << socket->peerport() << "." << endl;
-       } else {
-               cerr << "Conectado a " << socket->peerhost() <<
-                       ":" << socket->peerport() << "." << endl;
+                       cerr << __FILE__ << " : real_run() ERROR nro: " << e << endl;
+#endif // DEBUG
+                       // TODO - pasar como parametro codigo de error o algo.
+                       error_received();
+                       continue;
+               }
+               switch (response.status_code) {
+                       case HTTPMessage::OK:
+                               ok_received();
+                       default:
+                               error_received();
+               }
        }
+}
+
+ControlClient::SignalOKReceived& ControlClient::signal_ok_received(void) {
+       return ok_received;
+}
+
+ControlClient::SignalErrorReceived& ControlClient::signal_error_received(void) {
+       return error_received;
+}
+
+void ControlClient::send(const Command& command) {
+       socket << command << flush;
+#ifdef DEBUG
+       cerr << __FILE__ << ": send() Enviado!" << endl;
 #endif // DEBUG
 }
 
index f5c6c730ca017c8b0610d860e7045e8c6d52fef0..32d3306254d717919069c56f0f8cb6c68f743f58 100644 (file)
@@ -63,7 +63,7 @@ void ControlServer::real_run(void) {
        while (!stop) {
                Command command;
                try {
-                       Glib::Mutex::Lock lock(socket_mutex);
+                       //Glib::Mutex::Lock lock(socket_mutex);
                        socket >> command;
                // Si se cerró el socket.
                } catch (const ios::failure& e) {
@@ -77,6 +77,7 @@ void ControlServer::real_run(void) {
                                << e.code << " | reason = " << HTTPMessage::reason(e.code)
                                << " | desc = " << e.what() << endl;
 #endif // DEBUG
+                       //Glib::Mutex::Lock lock(socket_mutex);
                        socket << HTTPResponse(e) << flush;
                        continue;
                }
@@ -178,8 +179,11 @@ Accept-Ranges: bytes
 }
 
 void ControlServer::send(const HTTPResponse& response) {
-       Glib::Mutex::Lock lock(socket_mutex);
+       //Glib::Mutex::Lock lock(socket_mutex);
        socket << response << flush;
+#ifdef DEBUG
+       cerr << __FILE__ << ": send() Enviado!" << endl;
+#endif // DEBUG
 }
 
 ControlServer::SignalCommandReceived& ControlServer::signal_command_received(void) {
index af2875ecfcb441e2c48202033be7db999c135189..ba2b82596de3a251209b7ef77e30c445c2a191be 100644 (file)
@@ -58,7 +58,7 @@ void HTTPMessage::set_body(const string& _body) {
        body = _body;
        if (body.length()) {
                stringstream ss; // TODO ver forma mas linda de convertir
-               ss << (body.length());
+               ss << (body.length()+1); // FIXME No se por que tengo que sumarle 1.
                headers["Accept-Ranges"] = "bytes";
                headers["Content-Length"] = ss.str();
        }
@@ -74,36 +74,33 @@ istream& operator>>(istream& is, HTTPMessage& m) {
 #endif // DEBUG
        char buf[BUFSIZ];
        bool is_header = true;
-       // TODO body
-       // Para hacer que reciba bien el body hay que chequear la cabecera
-       // Content-length, si queda tiempo lo haré...
-       //stringstream body_ss;
        while (is.getline(buf, BUFSIZ)) {
                String sbuf(buf);
                sbuf.trim();
                if (sbuf.length()) {
-                       if (is_header) {
-                               stringstream ss;
-                               ss << sbuf;
-                               ss >> m.headers;
-                       }// else { TODO body
-                       //      body_ss << sbuf << endl;
-                       //}
+                       stringstream ss;
+                       ss << sbuf;
+                       ss >> m.headers;
+               // Fin de las cabeceras.
                } else {
-                       if (is_header) {
-                               // TODO body
-                               // Ver si tiene un Content-Length para saber si esperamos body.
-                               // Si no esperamos body, no hay que hacer otro is.getline()
-                               // porque se queda esperando forever.
-                               is_header = false;
-                               break;
-                       }// else { TODO body
-                       //      body_ss << sbuf << endl;
-                       //}
+                       // Hay Content-Length, entonces hay body (no respeta RFC AFAIK).
+                       if (m.headers.find("Content-Length") != m.headers.end()) {
+                               // Descarta la línea vacía para separar las cabeceras.
+                               is.getline(buf, BUFSIZ);
+                               stringstream ss(m.headers["Content-Length"]);
+                               streamsize size;
+                               ss >> size;
+                               char* buf2 = new char[size+1];
+                               if (is.readsome(buf2, size)) {
+                                       m.body = buf2;
+                               }
+                               delete buf2[];
+                       }
+                       // Después de una línea vacía, haya obtenido el body o no, sale del
+                       // while.
+                       break;
                }
        }
-       // TODO body
-       //m.body = body_ss.str();
        return is;
 }
 
@@ -122,6 +119,8 @@ string HTTPMessage::reason(unsigned code) {
                        return "OK";
                case BAD_REQUEST:
                        return "Bad Request";
+               case NOT_FOUND:
+                       return "Not Found";
                case LENGTH_REQUIRED:
                        return "Length Required";
                case INTERNAL_SERVER_ERROR:
@@ -131,7 +130,7 @@ string HTTPMessage::reason(unsigned code) {
                case HTTP_VERSION_NOT_SUPPORTED:
                        return "HTTP Version Not Supported";
                default:
-                       return "";
+                       return "No Reason";
        }
 }
 
index f1119fd8d5a0b5b22dba540016bbccc471586800..f9fa56c47e654825b6855270b2b6b99bb5b94870 100644 (file)
@@ -54,27 +54,6 @@ HTTPRequest::HTTPRequest(const string& uri, const HTTPMethod& method,
 #endif // DEBUG
 }
 
-/*
-HTTPRequest::HTTPRequest(const Serializable& body,
-               const string& version):
-               HTTPMessage(body, version) {
-#ifdef DEBUG
-       cerr << __FILE__ << ": http_version = " << http_version
-               << " | body = " << body.serialize() << endl;
-#endif // DEBUG
-}
-
-HTTPRequest::HTTPRequest(const string& uri,
-               const HTTPRequest::HTTPMethod& method,
-               string& query, string& version):
-               HTTPMessage(body, version) {
-#ifdef DEBUG
-       cerr << __FILE__ << ": http_version = " << http_version
-               << " | body = " << body.serialize() << endl;
-#endif // DEBUG
-}
-*/
-
 istream& operator>>(istream& is, HTTPRequest& req)
                throw(HTTPError, ios::failure) {
 #ifdef DEBUG
index 73963babf8597e797f4a99d451992a1f9c114e85..375087a169f7de12dfa894ba62e5d3cdf3ee460c 100644 (file)
@@ -100,44 +100,103 @@ void Server::on_control_command_received(const Command& command,
                << ", args = [" << String::join(command.get_args(), ", ") << "])"
                << endl;
 #endif // DEBUG
-       // TODO, seguir aca!
-       stringstream response_xml;
-       response_xml << "<html>" << endl;
-       response_xml << "    <head>" << endl;
-       response_xml << "        <title>PlaQui v0.4</title>" << endl;
-       response_xml << "    </head>" << endl;
-       response_xml << "    <body>" << endl;
-       response_xml << "        <h1>PlaQui</h1>" << endl;
-       response_xml << "        <p>versión 0.4</p>" << endl;
-       response_xml << "        <h2>Comando</h2>" << endl;
-       response_xml << "        <ul>" << endl;
-       response_xml << "           <li><b>Target:</b> " << command.get_target() << endl;
-       response_xml << "           <li><b>Command:</b> " << command.get_command() << endl;
-       response_xml << "           <li><b>Argumentos:</b>" << endl;
-       response_xml << "               <ol>" << endl;
-       for (Command::Arguments::const_iterator i = command.get_args().begin();
-                       i != command.get_args().end(); i++) {
-               response_xml << "                   <li>" << *i << "</li>" << endl;
+       HTTPResponse response(HTTPMessage::OK);
+       if (command.get_target() == "server") {
+#ifdef DEBUG
+       cerr << __FILE__ <<  ": server" << endl;
+#endif // DEBUG
+               if (command.get_command() == "status") {
+                       // FIXME
+                       stringstream response_xml;
+                       response_xml << "<html>" << endl;
+                       response_xml << "    <head>" << endl;
+                       response_xml << "        <title>PlaQui v0.6</title>" << endl;
+                       response_xml << "    </head>" << endl;
+                       response_xml << "    <body>" << endl;
+                       response_xml << "        <h1>PlaQui</h1>" << endl;
+                       response_xml << "        <p>versión 0.6</p>" << endl;
+                       response_xml << "        <h2>Comando</h2>" << endl;
+                       response_xml << "        <ul>" << endl;
+                       response_xml << "           <li><b>Target:</b> " << command.get_target() << endl;
+                       response_xml << "           <li><b>Command:</b> " << command.get_command() << endl;
+                       response_xml << "           <li><b>Argumentos:</b>" << endl;
+                       response_xml << "               <ol>" << endl;
+                       for (Command::Arguments::const_iterator i = command.get_args().begin();
+                                       i != command.get_args().end(); i++) {
+                               response_xml << "                   <li>" << *i << "</li>" << endl;
+                       }
+                       response_xml << "               </ol>" << endl;
+                       response_xml << "        </ul>" << endl;
+                       response_xml << "        <h2>Desarrollado por</h2>" << endl;
+                       response_xml << "        <ul>" << endl;
+                       response_xml << "            <li>Nicolás Dimov.</li>" << endl;
+                       response_xml << "            <li>Leandro Lucarella.</li>" << endl;
+                       response_xml << "            <li>Ricardo Markiewicz.</li>" << endl;
+                       response_xml << "        </ul>" << endl;
+                       response_xml << "        <address>" << endl;
+                       response_xml << "             Copyleft 2003 - bajo los " << endl;
+                       response_xml << "             términos de la licencia GPL" << endl;
+                       response_xml << "        </address>" << endl;
+                       response_xml << "    </body>" << endl;
+                       response_xml << "</html>" << endl;
+                       response.status_code = HTTPMessage::OK;
+                       response.set_body(response_xml.str());
+               } else if (command.get_command() == "stop") {
+                       stop = true;
+                       response.set_body("El server se apagará en instantes...");
+               } else {
+                       response.status_code = HTTPMessage::NOT_FOUND;
+                       response.set_body("Invalid command for 'server' taget!");
+               }
+       } else if (command.get_target() == "connection") {
+               if (command.get_command() == "list") {
+                       // FIXME
+                       TCPServer::ConnectionInfoList cil = get_connected();
+                       stringstream response_xml;
+                       response_xml << "<html>" << endl;
+                       response_xml << "    <head>" << endl;
+                       response_xml << "        <title>PlaQui v0.6</title>" << endl;
+                       response_xml << "    </head>" << endl;
+                       response_xml << "    <body>" << endl;
+                       response_xml << "        <h1>PlaQui</h1>" << endl;
+                       response_xml << "        <p>versión 0.6</p>" << endl;
+                       response_xml << "        <h2>Lista de conexiones:</h2>" << endl;
+                       response_xml << "        <ul>" << endl;
+                       for (TCPServer::ConnectionInfoList::const_iterator i = cil.begin();
+                                       i != cil.end(); i++) {
+                               response_xml << "       <li>" << i->host
+                                       << ":" << i->port << " [<a href=\"/connection/disconnect/"
+                                       << i->host << "/" << i->port << "\">deconectar</a>]</li>"
+                                       << endl;
+                       }
+                       response_xml << "        </ul>" << endl;
+                       response_xml << "        <address>" << endl;
+                       response_xml << "             Copyleft 2003 - bajo los " << endl;
+                       response_xml << "             términos de la licencia GPL" << endl;
+                       response_xml << "        </address>" << endl;
+                       response_xml << "    </body>" << endl;
+                       response_xml << "</html>" << endl;
+                       response.status_code = HTTPMessage::OK;
+                       response.set_body(response_xml.str());
+               } else if (command.get_command() == "stop") {
+                       // TODO server->finish();
+                       response.set_body("La conexión se cerrará en instantes...");
+               } else {
+                       response.status_code = HTTPMessage::NOT_FOUND;
+                       response.set_body("Invalid command for 'connection' taget!");
+               }
+       } else if (command.get_target() == "transmission") {
+       } else if (command.get_target() == "plant") {
+       } else {
+               response.status_code = HTTPMessage::NOT_FOUND;
+               response.set_body("Invalid Target!");
        }
-       response_xml << "               </ol>" << endl;
-       response_xml << "        </ul>" << endl;
-       response_xml << "        <h2>Desarrollado por</h2>" << endl;
-       response_xml << "        <ul>" << endl;
-       response_xml << "            <li>Nicolás Dimov.</li>" << endl;
-       response_xml << "            <li>Leandro Lucarella.</li>" << endl;
-       response_xml << "            <li>Ricardo Markiewicz.</li>" << endl;
-       response_xml << "        </ul>" << endl;
-       response_xml << "        <address>" << endl;
-       response_xml << "             Copyleft 2003 - bajo los " << endl;
-       response_xml << "             términos de la licencia GPL" << endl;
-       response_xml << "        </address>" << endl;
-       response_xml << "    </body>" << endl;
-       response_xml << "</html>" << endl;
-       HTTPResponse response(HTTPMessage::OK, response_xml.str());
+       // FIXME
        response.headers["Content-Type"] = "text/html; charset=iso-8859-1";
-       //response.headers["Connection"] = "close";
-               server->send(response);
-       }
+       response.headers["Connection"] = "close";
+       server->send(response);
+       server->finish();
+}
 
 } // namespace Server
 
index 8569c7ab9b292073e725b2cb539c3eeb24e0a646..0f97fe5a762b5fbaebcfc0410ff62685cbad39cf 100644 (file)
@@ -110,6 +110,21 @@ void TCPServer::real_run(void) {
        }
 }
 
+TCPServer::ConnectionInfoList TCPServer::get_connected(void) {
+#ifdef DEBUG
+       cerr << __FILE__ <<  ": get_connected()" << endl;
+#endif // DEBUG
+       TCPServer::ConnectionInfoList con;
+       Glib::Mutex::Lock lock(connections_mutex);
+       for (ConnectionList::const_iterator i = connections.begin();
+                       i != connections.end(); i++) {
+               TCPServer::ConnectionInfo ci =
+                       { (*i)->get_peerhost(), (*i)->get_peerport() };
+               con.push_back(ci);
+       }
+       return con;
+}
+
 } // namespace Server
 
 } // namespace PlaQui
index 526d9228d060f832d6d4d483d5c888953b17bd69..0210ffe18fc530832936fa5424454aedf7ab4a48 100644 (file)
@@ -25,6 +25,9 @@
 # $Id$
 #
 
+# Defino compilador y linker ?
+CC=gcc
+
 # Ubicación de archivos .h
 INCLUDE_BASE_DIR=../include
 INCLUDE_DIR=$(INCLUDE_BASE_DIR)
@@ -38,7 +41,7 @@ CXXFLAGS=-ansi -pedantic -Wall -I$(INCLUDE_DIR) \
 CXXFLAGS+=-g -DDEBUG
 #CXXFLAGS+=-g
 #CXXFLAGS+=-O3
-LDFLAGS=-lsocket++ -L$(LIB_FILES) `pkg-config --libs glibmm-2.0 gthread-2.0`
+LDFLAGS=-lsocket++ `pkg-config --libs glibmm-2.0 gthread-2.0` #-L$(LIB_FILES)
 
 TARGETS=server_test
 
index cc23f63421ea2ded9944d96d377e4d379bb2622a..eaee99a14f135739e8fbbf9f863db92f8942e5a7 100644 (file)
@@ -1,6 +1,6 @@
 
                          +----------------------------+
-                         | PROPUESTA DE SERVIDOR v0.3 |
+                         | PROPUESTA DE SERVIDOR v0.4 |
                          +----------------------------+
 
                  $Id$
@@ -93,6 +93,7 @@ Comando        | Descripci
 status   | Obtiene estado general | Cantidad de plantas, conexiones,
          | del servidor.          | transmisiones, versión, uptime, etc.
 ---------+------------------------+---------------------------------------------
+stop     | Detiene el servidor.   | Nada.
 
 Comandos para una Planta:
 -------------------------
@@ -116,8 +117,8 @@ stop/<planta>  |Finaliza la simulaci
 ---------------+-----------------------------+----------------------------------
 set/<planta>   |Cambia la propiedad <prop>   |Nada (a ver si no retorna el valor
  /<elem>       |del elemento <elem>,         |realmente aceptado).
- /<prop>       |asignándole el valor <v> a   |
- /<v>          |planta de nombre <planta>.   |
+ /<prop>       |asignándole el valor <val> a |
+ /<val>        |planta de nombre <planta>.   |
 
 NOTA: Los nombres entre "<" y ">" denotan un argumento.
 
@@ -126,20 +127,42 @@ Comandos para una Transmisi
 Todos los comandos de transmisiones comienzan con /transmission/ y continúan con
 alguna de las siguientes opciones:
 
-Comando                        |Descripción                         |Respuesta
+Comando                   |Descripción                              |Respuesta
 -------------------+-----------------------------------------+------------------
-list               |Obtiene una lista de las las             |Lista de transmi-
-                   |transmisiones activas.                   |siones activas 
+list               |Obtiene una lista de las transmisiones   |Lista de transmi-
+                   |activas.                                 |siones activas 
                    |                                         |(host, puerto, 
                    |                                         |uptime, etc).
 -------------------+-----------------------------------------+------------------
-start/<host>/<port>|Comienza la transmisión al <host> en el  |Nada.
-                   |puerto al <host> en el puerto <port>.    |
+start/<plant>      |Comienza la transmisión de la planta     |Nada.
+ /<host>/<port>    |<plant> al <host> en elpuerto al <host>  |
+                   |en el puerto <port>.                     |
 -------------------+-----------------------------------------+------------------
-stop/<host>/<port> |Finaliza la transmisiónal <host> en el   |Nada.
-                   |puerto <port>. Si se omite el <host>, se |
+stop/<host>/<port> |Finaliza la transmisión al <host> en el  |Nada.
+                   |puerto <port>. Si se omite el <port>, se |
+                   |finalizan todas las transmisiones al     |
+                   |<host>. Si se omite el <host>, se        |
                    |finalizan todas las transmisiones.       |
 
+Comandos para una Conexión de Control:
+--------------------------------------
+Todos los comandos de transmisiones comienzan con /transmission/ y continúan con
+alguna de las siguientes opciones:
+
+Comando                   |Descripción                              |Respuesta
+-------------------+-----------------------------------------+------------------
+list               |Obtiene una lista de las conexiones de   |Lista de conexio-
+                   |control activas.                         |nes activas (host,
+                   |                                         |puerto, uptime,
+                   |                                         |etc).
+-------------------+-----------------------------------------+------------------
+stop/<host>/<port> |Finaliza la conexión de control del host |Nada.
+                   |<host> en el puerto <port>. Si se omite  |
+                   |el <port> se finalizan todas las         |
+                   |conexiones al <host>. Si se omite también|
+                   |el <host>, se finalizan todas las        |
+                   |conexiones de control.                   |
+
 NOTA: Los nombres entre "<" y ">" denotan un argumento.