X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/212f9ae5dc8899bab8b23ed13d81c28c510db3c3..dafb509182bac9b314202fe7dfaf58206da5ccbe:/Server/src/tcpserver.cpp?ds=sidebyside diff --git a/Server/src/tcpserver.cpp b/Server/src/tcpserver.cpp index 8272e57..61d3e11 100644 --- a/Server/src/tcpserver.cpp +++ b/Server/src/tcpserver.cpp @@ -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( - 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(); } }