X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/7e74b790d290cd7d776349503bb361c47933c01f..658a6629fd4958dad9add9d2a1e06de6003fa5aa:/Server/src/tcpserver.cpp diff --git a/Server/src/tcpserver.cpp b/Server/src/tcpserver.cpp index ffbdead..8b1c3bb 100644 --- a/Server/src/tcpserver.cpp +++ b/Server/src/tcpserver.cpp @@ -27,6 +27,7 @@ #include "plaqui/server/tcpserver.h" #include +#include #ifdef DEBUG # include #endif // DEBUG @@ -42,10 +43,20 @@ TCPServer::~TCPServer(void) { cerr << __FILE__ << "(" << __LINE__ << ")" << ": destructor." << endl; #endif // DEBUG - Glib::Mutex::Lock lock(connections_mutex); + // Mando a terminar todas las conexiones. + connections_mutex.lock(); for (ConnectionList::iterator con = connections.begin(); con != connections.end(); con++) { - (*con)->finish(true); + (*con)->finish(); + } + ConnectionList::size_type count = connections.size(); + connections_mutex.unlock(); + // Espero que terminen realmente. + while (count) { + Glib::usleep(10000); // 10 milisegundos + connections_mutex.lock(); + count = connections.size(); + connections_mutex.unlock(); } } @@ -60,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__ << ")" @@ -75,8 +87,13 @@ TCPServer::TCPServer(const Connection::Port& port) throw(sockerr): } /*void TCPServer::finish(bool attach) { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": finish(attach = " << attach << ");" << endl; +#endif // DEBUG //socket_mutex.lock(); - socket.shutdown(sockbuf::shut_readwrite); + close(socket.sd()); + //socket.shutdown(sockbuf::shut_readwrite); //socket_mutex.unlock(); Runnable::finish(attach); }*/ @@ -99,19 +116,18 @@ 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; #endif // DEBUG Connection* connection; - while (!stop) { + while (!stop()) { // Forma grasa de salir del accept: crear conexion que salga al toque. try { connection = new_connection(socket.accept()); } catch (const sockerr& e) { // No se si el accept() puede fallar. - error(e.serrno(), e.errstr()); + signal_error().emit(e.serrno(), e.errstr()); continue; // Supongo que puede seguir aceptando conexiones. } #ifdef DEBUG