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()
#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;
}
}
+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