X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/b92547a5de3a3fb4f14a2bea4a4e776b8da3cb5c..a359eb714e150b2b59856d0056b9880aaaedd128:/Server/src/tcpserver.cpp?ds=sidebyside diff --git a/Server/src/tcpserver.cpp b/Server/src/tcpserver.cpp index 9d83135..e78e53c 100644 --- a/Server/src/tcpserver.cpp +++ b/Server/src/tcpserver.cpp @@ -37,18 +37,26 @@ namespace PlaQui { namespace Server { -const unsigned TCPServer::MAX_PENDING_CONNECTIONS = 10; - TCPServer::~TCPServer(void) { #ifdef DEBUG cerr << __FILE__ << ": 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(int port): socket(sockbuf::sock_stream) { +TCPServer::TCPServer(const Connection::Port& port): socket(sockbuf::sock_stream) { #ifdef DEBUG cerr << __FILE__ << ": 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.bind(port); #ifdef DEBUG cerr << __FILE__ << ": escuchando en " << socket.localhost() @@ -61,8 +69,14 @@ TCPServer::TCPServer(int port): socket(sockbuf::sock_stream) { #endif // DEBUG } -void TCPServer::on_connection_finished( - Connection* connection) { +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 = " << connection << ")" << endl; @@ -113,6 +127,37 @@ void TCPServer::real_run(void) { } } +bool TCPServer::disconnect(const std::string& host, const Connection::Port& port) { +#ifdef DEBUG + cerr << __FILE__ << ": disconnect(host = " << host + << ", port = " << port << ")" << endl; +#endif // DEBUG + Glib::Mutex::Lock lock(connections_mutex); + for (ConnectionList::iterator con = connections.begin(); + con != connections.end(); con++) { + if (((*con)->get_host() == host) && ((*con)->get_port() == port)) { + (*con)->finish(); + return true; + } + } + return false; +} + +TCPServer::ConnectionInfoList TCPServer::get_connected(void) { +#ifdef DEBUG + cerr << __FILE__ << ": get_connected()" << endl; +#endif // DEBUG + TCPServer::ConnectionInfoList cl; + Glib::Mutex::Lock lock(connections_mutex); + for (ConnectionList::const_iterator con = connections.begin(); + con != connections.end(); con++) { + TCPServer::ConnectionInfo ci = + { (*con)->get_host(), (*con)->get_port() }; + cl.push_back(ci); + } + return cl; +} + } // namespace Server } // namespace PlaQui