]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/tcpserver.cpp
Se mejora el manejo de errores. Ahora con el codigo de error va una descripcion
[z.facultad/75.42/plaqui.git] / Server / src / tcpserver.cpp
index 8272e57aaf35456ce283410501ac1922dcb3e195..61d3e11753e7413ea10cca0a948f25e1a518a220 100644 (file)
@@ -71,6 +71,7 @@ TCPServer::TCPServer(const Connection::Port& port) throw(sockerr):
        //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
        cerr << __FILE__ << "(" << __LINE__ << ")"
@@ -85,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
@@ -115,8 +123,7 @@ void TCPServer::on_connection_finished(Connection* connection) {
 #endif // DEBUG
 }
 
-/// \todo TODO: ver tema de timeout o como salir de un accept().
-void TCPServer::real_run(void) {
+void TCPServer::real_run(void) throw() {
 #ifdef DEBUG
        cerr << __FILE__ << "(" << __LINE__ << ")"
                <<  ": real_run()" << endl;
@@ -149,11 +156,9 @@ void TCPServer::real_run(void) {
                // 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();
        }
 }