]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/tcpserver.cpp
Actualizo protocolo de comandos HTTP. Ahora es mucho mas simple y extensible.
[z.facultad/75.42/plaqui.git] / Server / src / tcpserver.cpp
index 413122464a6b263b54762937d2a83296cc11a8a9..a7b3dc7e6db8fbe96c817ec068966896c14e0f1c 100644 (file)
 
 #include "plaqui/server/tcpserver.h"
 #include <sigc++/class_slot.h>
 
 #include "plaqui/server/tcpserver.h"
 #include <sigc++/class_slot.h>
+// FIXME - para probar mutex
+#include <glibmm/timer.h>
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
 
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
 
+const unsigned PlaQui::Server::TCPServer::MAX_PENDING_CONNECTIONS = 10;
+
 PlaQui::Server::TCPServer::~TCPServer(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": destructor." << std::endl;
 PlaQui::Server::TCPServer::~TCPServer(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": destructor." << std::endl;
@@ -47,7 +51,7 @@ PlaQui::Server::TCPServer::TCPServer(int port):
        std::cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
                << ":" << socket.localport() << "." << std::endl;
 #endif // DEBUG
        std::cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
                << ":" << socket.localport() << "." << std::endl;
 #endif // DEBUG
-       socket.listen();
+       socket.listen(MAX_PENDING_CONNECTIONS);
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
                << socket.localhost() << ":" << socket.localport() << "." << std::endl;
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
                << socket.localhost() << ":" << socket.localport() << "." << std::endl;
@@ -60,7 +64,8 @@ void PlaQui::Server::TCPServer::on_connection_finished(
        std::cerr << __FILE__ <<  ": on_connection_finished(connection = "
                << connection << ")" << std::endl;
 #endif // DEBUG
        std::cerr << __FILE__ <<  ": on_connection_finished(connection = "
                << connection << ")" << std::endl;
 #endif // DEBUG
-       // TODO: poner lock.
+       Glib::Mutex::Lock lock(connections_mutex);
+       // XXX connections_mutex.lock();
        connections.remove(connection);
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": lista de conexiones" << std::endl;
        connections.remove(connection);
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": lista de conexiones" << std::endl;
@@ -69,33 +74,31 @@ void PlaQui::Server::TCPServer::on_connection_finished(
                std::cerr << "\t " << *i << std::endl;
        }
 #endif // DEBUG
                std::cerr << "\t " << *i << std::endl;
        }
 #endif // DEBUG
-       // TODO: sacar lock.
+       // XXX connections_mutex.unlock();
 }
 
 }
 
+/// \todo TODO: ver tema de timeout o como salir de un accept().
 void PlaQui::Server::TCPServer::real_run(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": real_run()" << std::endl;
 #endif // DEBUG
        Connection* connection;
        while (!stop) {
 void PlaQui::Server::TCPServer::real_run(void) {
 #ifdef DEBUG
        std::cerr << __FILE__ <<  ": real_run()" << std::endl;
 #endif // DEBUG
        Connection* connection;
        while (!stop) {
-               // TODO: ver tema de timeout o como salir de un accept().
                // Forma grasa de salir del accept: crear conexion que salga al toque.
                connection = new_connection(socket.accept());
 #ifdef DEBUG
                // Forma grasa de salir del accept: crear conexion que salga al toque.
                connection = new_connection(socket.accept());
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": real_run(): connection = " << connection
-               << std::endl;
+               std::cerr << __FILE__ <<  ": real_run(): connection = " << connection
+                       << std::endl;
 #endif // DEBUG
 #endif // DEBUG
-               // TODO: poner lock.
+               Glib::Mutex::Lock lock(connections_mutex);
                connections.push_back(connection);
 #ifdef DEBUG
                connections.push_back(connection);
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": real_run(): lista de conexiones" << std::endl;
-       for (ConnectionList::const_iterator i = connections.begin();
-                       i != connections.end(); i++) {
-               std::cerr << "\t " << *i << std::endl;
-       }
+               std::cerr << __FILE__ <<  ": real_run(): lista de conexiones" << std::endl;
+               for (ConnectionList::const_iterator i = connections.begin();
+                               i != connections.end(); i++) {
+                       std::cerr << "\t " << *i << std::endl;
+               }
 #endif // DEBUG
 #endif // DEBUG
-               // TODO: sacar lock.
-               // TODO: esto va en Server::new_connection()
                // Conecto la señal para cuando termina una conexión, borrarla.
                connection->signal_finished().connect(
                                SigC::bind<Connection*>(
                // Conecto la señal para cuando termina una conexión, borrarla.
                connection->signal_finished().connect(
                                SigC::bind<Connection*>(
@@ -103,6 +106,7 @@ void PlaQui::Server::TCPServer::real_run(void) {
                                                &TCPServer::on_connection_finished),
                                        connection));
                connection->run();
                                                &TCPServer::on_connection_finished),
                                        connection));
                connection->run();
+               //connections_mutex.unlock(); // Si pongo el mutex antes del run(), muere.
        }
 }
 
        }
 }