X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/a0481d50f6da9cac5efd3502c3657b3fc461ec0d..561dba59a06d7f7cc5614b1648484e439aebb771:/Server/src/tcpserver.cpp diff --git a/Server/src/tcpserver.cpp b/Server/src/tcpserver.cpp index d15f34d..ffbdead 100644 --- a/Server/src/tcpserver.cpp +++ b/Server/src/tcpserver.cpp @@ -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);