]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/tcpserver.cpp
Se agrega docs de instalaciĆ³n.
[z.facultad/75.42/plaqui.git] / Server / src / tcpserver.cpp
index d15f34ddb31bcae01ff02c840975c04ad55da495..ffbdead609cf9ae0ac28fe20fef4f232ae3780fc 100644 (file)
@@ -39,13 +39,21 @@ namespace Server {
 
 TCPServer::~TCPServer(void) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": destructor." << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": destructor." << endl;
 #endif // DEBUG
+       Glib::Mutex::Lock lock(connections_mutex);
+       for (ConnectionList::iterator con = connections.begin();
+                       con != connections.end(); con++) {
+               (*con)->finish(true);
+       }
 }
 
-TCPServer::TCPServer(const Connection::Port& port): socket(sockbuf::sock_stream) {
+TCPServer::TCPServer(const Connection::Port& port) throw(sockerr):
+               socket(sockbuf::sock_stream) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": port = " << port << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": port = " << port << endl;
 #endif // DEBUG
        // FIXME
        //cerr << "recvtimeout = " << socket.recvtimeout(1) << endl;
@@ -54,32 +62,36 @@ TCPServer::TCPServer(const Connection::Port& port): socket(sockbuf::sock_stream)
        //cerr << "sendtimeout = " << socket.sendtimeout(1) << endl;
        socket.bind(port);
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": escuchando en " << socket.localhost()
                << ":" << socket.localport() << "." << endl;
 #endif // DEBUG
        socket.listen(MAX_PENDING_CONNECTIONS);
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": [despues de listen()] escuchando en "
                << socket.localhost() << ":" << socket.localport() << "." << endl;
 #endif // DEBUG
 }
 
-void TCPServer::finish(bool attach) {
+/*void TCPServer::finish(bool attach) {
        //socket_mutex.lock();
        socket.shutdown(sockbuf::shut_readwrite);
        //socket_mutex.unlock();
        Runnable::finish(attach);
-}
+}*/
 
 void TCPServer::on_connection_finished(Connection* connection) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": on_connection_finished(connection = "
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": on_connection_finished(connection = "
                << connection << ")" << endl;
 #endif // DEBUG
        Glib::Mutex::Lock lock(connections_mutex);
        connections.remove(connection);
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": lista de conexiones" << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": lista de conexiones" << endl;
        for (ConnectionList::const_iterator i = connections.begin();
                        i != connections.end(); i++) {
                cerr << "\t " << *i << endl;
@@ -90,21 +102,29 @@ void TCPServer::on_connection_finished(Connection* connection) {
 /// \todo TODO: ver tema de timeout o como salir de un accept().
 void TCPServer::real_run(void) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": real_run()" << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": real_run()" << endl;
 #endif // DEBUG
        Connection* connection;
        while (!stop) {
                // Forma grasa de salir del accept: crear conexion que salga al toque.
-               connection = new_connection(socket.accept());
+               try {
+                       connection = new_connection(socket.accept());
+               } catch (const sockerr& e) { // No se si el accept() puede fallar.
+                       error(e.serrno(), e.errstr());
+                       continue; // Supongo que puede seguir aceptando conexiones.
+               }
 #ifdef DEBUG
-               cerr << __FILE__ <<  ": real_run(): connection = " << connection
+               cerr << __FILE__ << "(" << __LINE__ << ")"
+                       <<  ": real_run(): connection = " << connection
                        << endl;
 #endif // DEBUG
                Glib::Mutex::Lock lock(connections_mutex);
                // XXX connections_mutex.lock();
                connections.push_back(connection);
 #ifdef DEBUG
-               cerr << __FILE__ <<  ": real_run(): lista de conexiones" << endl;
+               cerr << __FILE__ << "(" << __LINE__ << ")"
+                       <<  ": real_run(): lista de conexiones" << endl;
                for (ConnectionList::const_iterator i = connections.begin();
                                i != connections.end(); i++) {
                        cerr << "\t " << *i << endl;
@@ -124,7 +144,8 @@ void TCPServer::real_run(void) {
 
 bool TCPServer::disconnect(const std::string& host, const Connection::Port& port) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": disconnect(host = " << host
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": disconnect(host = " << host
                << ", port = " << port << ")" << endl;
 #endif // DEBUG
        Glib::Mutex::Lock lock(connections_mutex);
@@ -138,9 +159,11 @@ bool TCPServer::disconnect(const std::string& host, const Connection::Port& port
        return false;
 }
 
+/// \todo TODO Hay que reemplazarlo por una lista generica.
 TCPServer::ConnectionInfoList TCPServer::get_connected(void) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": get_connected()" << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": get_connected()" << endl;
 #endif // DEBUG
        TCPServer::ConnectionInfoList cl;
        Glib::Mutex::Lock lock(connections_mutex);