1 // vim: set noexpandtab tabstop=4 shiftwidth=4:
2 //----------------------------------------------------------------------------
4 //----------------------------------------------------------------------------
5 // This file is part of PlaQui.
7 // PlaQui is free software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the Free Software
9 // Foundation; either version 2 of the License, or (at your option) any later
12 // PlaQui is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 // You should have received a copy of the GNU General Public License along
18 // with PlaQui; if not, write to the Free Software Foundation, Inc., 59 Temple
19 // Place, Suite 330, Boston, MA 02111-1307 USA
20 //----------------------------------------------------------------------------
21 // Creado: Tue Oct 21 23:42:46 ART 2003
22 // Autores: Leandro Lucarella <llucare@fi.uba.ar>
23 //----------------------------------------------------------------------------
28 #ifndef PLAQUI_TCPSERVER_H
29 #define PLAQUI_TCPSERVER_H
31 #include "plaqui/server/runnable.h"
32 #include "plaqui/server/connection.h"
33 #include <socket++/sockinet.h>
34 #include <sigc++/signal.h>
43 * Servidor genéríco TCP/IP.
45 * Maneja muchas conexiones, en threads. En términos generales todo lo que
46 * hace es algo parecido a esto:
49 * Connection* conexion = new_connection(accept());
50 * connections.push_back(conexion);
54 * new_connection() es un método virtual puro que hay que definir en las
55 * subclases para hacer un servidor específico que trabaje con un protocolo
56 * determinado. new_connection() devuelve un puntero a una
57 * \ref Connection "conexión".
59 * on_connection_finished() maneja la
60 * \ref Runnable::signal_finished "señal para indicar que una conexión terminó"
61 * para eliminarla de la \ref connections "lista de conexiones".
63 class TCPServer: public Runnable {
65 /////////////////////////////////////////////////////////////////////
70 /// Cantidad máxima de conexiones pendientes.
71 static const unsigned MAX_PENDING_CONNECTIONS = 10;
73 /////////////////////////////////////////////////////////////////////
78 /// Lista de conexiones de control.
79 typedef std::list<Connection*> ConnectionList;
83 /// Información sobre una conexión de contro.
84 struct ConnectionInfo {
88 Connection::Port port;
91 /// Lista de información de conexiones de control.
92 typedef std::vector<ConnectionInfo> ConnectionInfoList;
94 /////////////////////////////////////////////////////////////////////
100 /// Tipo de señal para indicar que se inició una conexión.
101 typedef SigC::Signal2<void, const std::string&,
102 const Connection::Port&> SignalConnectionOpened;
104 /// Obtiene la señal que avisa que se inició una conexión.
105 SignalConnectionOpened& signal_connection_opened(void);
109 /////////////////////////////////////////////////////////////////////
114 /// Socket para escuchar conexiones.
119 /// Señal que indica que se inició una conexión.
120 SignalConnectionOpened _connection_opened;
122 /// Conexiones de control.
123 ConnectionList connections;
125 /// Mutex para las conexiones.
126 Glib::Mutex connections_mutex;
128 /////////////////////////////////////////////////////////////////////
134 * Entra en el loop para atender conexiones.
136 virtual void real_run(void) throw();
141 * Obtiene una nueva \ref Connection "conexión".
143 * \param sd Descriptor del socket de la nueva conexión.
145 * \return Nueva conexión.
147 virtual Connection* new_connection(const sockbuf::sockdesc& sd) = 0;
154 virtual ~TCPServer(void);
159 * \param port Puerto en el cual escuchar.
161 TCPServer(const Connection::Port& port) throw(sockerr);
166 * \note Para saber cuando la tarea fue finalizada puede utilizar
167 * la señal signal_finished().
169 virtual void finish(void);
172 * Se encarga de borrar una conexión de la lista cuando finaliza.
174 * \param connection Conexión a eliminar.
176 void on_connection_finished(Connection* connection);
179 * Detiene una conexión.
181 bool disconnect(const std::string& host,
182 const Connection::Port& port);
185 * Obtiene una lista conexiones de control abiertas.
187 ConnectionInfoList get_connected(void);
195 #endif // PLAQUI_TCPSERVER_H