]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/tcpserver.cpp
Se agrega un try para tratar de solucionar situaciones en las que el server
[z.facultad/75.42/plaqui.git] / Server / src / tcpserver.cpp
index d85490c78bce214e1edcf45b7f75b4bc0b24adab..04fd8bab9128ec1a4014990a7ba27217e926bef1 100644 (file)
@@ -66,11 +66,6 @@ TCPServer::TCPServer(const Connection::Port& port) throw(sockerr):
        cerr << __FILE__ << "(" << __LINE__ << ")"
                <<  ": port = " << port << endl;
 #endif // DEBUG
-       // FIXME
-       //cerr << "recvtimeout = " << socket.recvtimeout(1) << endl;
-       //cerr << "sendtimeout = " << socket.sendtimeout(1) << endl;
-       //cerr << "recvtimeout = " << socket.recvtimeout(1) << endl;
-       //cerr << "sendtimeout = " << socket.sendtimeout(1) << endl;
        socket.reuseaddr(true);
        socket.bind(port);
 #ifdef DEBUG
@@ -98,7 +93,7 @@ void TCPServer::finish(void) {
                sockinetbuf suicida(sockbuf::sock_stream);
                suicida.connect(socket.localhost(), socket.localport());
        } catch (const sockerr& e) {
-               // FIXME
+               // FIXME mejorar codigos de error.
                signal_error().emit(100000 + e.serrno(), string("No se pudo crear "
                                        "conexión 'suicida' para terminar el servidor: ")
                                        + e.errstr());
@@ -134,16 +129,20 @@ void TCPServer::real_run(void) throw() {
                try {
                        connection = new_connection(socket.accept());
                } catch (const sockerr& e) { // No se si el accept() puede fallar.
-                       signal_error().emit(e.serrno(), e.errstr());
+                       signal_error().emit(e.serrno(),
+                                       string("Error creando conexión nueva: ") + e.errstr());
                        continue; // Supongo que puede seguir aceptando conexiones.
                }
+               if (!stop()) {
+                       // Solo avisamos si la conexión que viene no es para matarnos.
+                       _connection_opened(connection->get_host(), connection->get_port());
+               }
 #ifdef DEBUG
                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__ << "(" << __LINE__ << ")"
@@ -153,14 +152,10 @@ void TCPServer::real_run(void) throw() {
                        cerr << "\t " << *i << endl;
                }
 #endif // DEBUG
-               // XXX connections_mutex.unlock(); // Si pongo el mutex antes del run(),
-               //                                    muere.
                // Conecto la señal para cuando termina una conexión, borrarla.
-               connection->signal_finished().connect(
-                               SigC::bind<Connection*>(
-                                       SigC::slot_class(*this,
-                                               &TCPServer::on_connection_finished),
-                                       connection));
+               connection->signal_finished().connect(SigC::bind(
+                               SigC::slot_class(*this, &TCPServer::on_connection_finished),
+                               connection));
                connection->run();
        }
 }
@@ -199,6 +194,10 @@ TCPServer::ConnectionInfoList TCPServer::get_connected(void) {
        return cl;
 }
 
+TCPServer::SignalConnectionOpened& TCPServer::signal_connection_opened(void) {
+       return _connection_opened;
+}
+
 } // namespace Server
 
 } // namespace PlaQui