1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_comm_Network_hpp
10 #define anna_comm_Network_hpp
12 #include <netinet/in.h>
16 #include <anna/core/Singleton.hpp>
18 #include <anna/comm/INetAddress.hpp>
31 class TransportFactory;
32 class ReceiverFactory;
35 Representacion logica de la estructura de red donde se ejecuta nuestra aplicacion.
37 class Network : public Singleton <Network> {
40 * Modo de actuar a la hora de crear una conexión mediante #createConnection o #resolveConnection.
41 * \li Si el modo es \em Unique y ya existe una instancia previa conectada a una IP puerto se devuelve esa misma
43 * \li Si el modo es \em Multiple se pueden abrir tantas conexiones como se deseé sobre una misma IP:port.
45 struct Port { enum _v { Unique, Multiple }; };
46 struct DoConnect { enum _v { Yes, No }; };
49 typedef std::vector <Host*> host_container; /**< Definicion para gestionar las maquinas */
50 typedef host_container::iterator host_iterator; /**< Definicion para el iterador de maquinas */
51 typedef host_container::const_iterator const_host_iterator; /**< Definicion para el iterador de maquinas */
53 typedef std::vector <Device*> device_container; /**< Definicion para gestionar los dispositivos de red */
54 typedef device_container::iterator device_iterator; /**< Definicion para el iterador de dispositivos de red */
55 typedef device_container::const_iterator const_device_iterator; /**< Definicion para el iterador de dispositivos de red */
58 Devuelve un puntero al dispositivo que coincide con la direccion IP
59 recibida como parametro. Si no encuentra ninguna coincidencia se creara automaticamente.
61 @param address Direccion de la maquina buscada.
63 @return La instancia del dispositivo que coincide con la direccion IP recibida como parametro.
65 Device* find(const in_addr_t& address) throw();
68 Devuelve un iterador al comienzo de la lista de dispositivos de red.
69 \return un iterador al comienzo de la lista de dispositivos de red.
71 const_device_iterator device_begin() const throw() { return a_devices.begin(); }
74 Devuelve un iterador al final de la lista de dispositivos de red.
75 \return un iterador al final de la lista de dispositivos de red.
77 const_device_iterator device_end() const throw() { return a_devices.end(); }
80 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
82 \param ii Iterador que estamos recorriendo.
83 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
86 static const Device* device(const_device_iterator ii) throw() { return *ii; }
89 Devuelve un iterador al comienzo de la lista de dispositivos de red.
90 \return un iterador al comienzo de la lista de dispositivos de red.
92 device_iterator device_begin() throw() { return a_devices.begin(); }
95 Devuelve un iterador al final de la lista de dispositivos de red.
96 \return un iterador al final de la lista de dispositivos de red.
98 device_iterator device_end() throw() { return a_devices.end(); }
101 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
103 \param ii Iterador que estamos recorriendo.
104 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
107 static Device* device(device_iterator ii) throw() { return *ii; }
110 Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
111 maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
112 con este nombre se creara.
114 @param name Nombre logico de la maquina.
116 @return La instancia de la maquina asociada al nombre recibido.
118 Host* find_host(const char* name) throw();
121 Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
122 maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
123 con este nombre se creara.
125 @param name Nombre logico de la maquina.
127 @return La instancia de la maquina asociada al nombre recibido.
129 Host* find_host(const std::string& name) throw() { return find_host(name.c_str()); }
132 * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
133 * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
134 * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
135 * direcciones IP's retornadas por el sistema.
137 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
138 * de la forma www.gopher.net
140 * \return Si el nombre de host ho ha sido definido previamente mediante
141 * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
142 * direcciones IP's retornadas por el sistema
144 * \see man gethostbyname.
146 Host* resolve(const char* hostname) throw(RuntimeException);
149 * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
150 * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
151 * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
152 * direcciones IP's retornadas por el sistema.
154 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
155 * de la forma www.gopher.net
157 * \return Si el nombre de host ho ha sido definido previamente mediante
158 * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
159 * direcciones IP's retornadas por el sistema
161 * \see man gethostbyname.
163 Host* resolve(const std::string& hostname) throw(RuntimeException) { return resolve(hostname.c_str()); }
166 Devuelve un iterador al comienzo de la lista de maquinas no modificables.
167 \return Un iterador al comienzo de la lista de maquinas no modificables.
169 const_host_iterator host_begin() const throw() { return a_hosts.begin(); }
172 Devuelve un iterador al final de la lista de maquinas no modificables.
173 \return Un iterador al final de la lista de maquinas no modificables.
175 const_host_iterator host_end() const throw() { return a_hosts.end(); }
178 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
180 \param ii Iterador que estamos recorriendo.
181 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
184 static const Host* host(const_host_iterator ii) throw() { return *ii; }
187 Devuelve un iterador al comienzo de la lista de maquinas no modificables.
188 \return Un iterador al comienzo de la lista de maquinas no modificables.
190 host_iterator host_begin() throw() { return a_hosts.begin(); }
193 Devuelve un iterador al final de la lista de maquinas no modificables.
194 \return Un iterador al final de la lista de maquinas no modificables.
196 host_iterator host_end() throw() { return a_hosts.end(); }
199 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
201 \param ii Iterador que estamos recorriendo.
202 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
205 static Host* host(host_iterator ii) throw() { return *ii; }
208 Crea la instancia de un anna::comm::Server disponible para conectar con la
209 IP y puerto indicados.
211 \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
212 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
213 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
214 automatica de la conexion.
215 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
217 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
218 \param doConnect Realiza o ignora, la conexion del recurso creado.
219 \return La instancia de comm::Server asociado al IP y puerto recibido.
220 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
222 Server* createServer(const char* ip, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
223 throw(RuntimeException);
226 Crea la instancia de un anna::comm::Server disponible para conectar con la
227 IP y puerto indicados.
229 \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
230 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
231 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
232 automatica de la conexion.
233 \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
234 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
236 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
237 \param doConnect Realiza o ignora, la conexion del recurso creado.
238 \return La instancia de comm::Server asociado al IP y puerto recibido.
239 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
241 Server* createServer(const char* ip, const int remotePort, const bool autoRecovery, ReceiverFactory& receiverFactory, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
242 throw(RuntimeException);
245 // Devuelve la instancia del anna::comm::Server asociado a la IP y puerto recibidos.
247 // \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
248 // \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
250 // \return La instancia de comm::Server asociado al IP y puerto recibido.
251 // \warning El anna::comm::Server devuelto puede ser NULL.
253 // Server* findServer (const char* ip, const int remotePort) throw (RuntimeException);
256 Crea la instancia de un anna::comm::Server disponible para conectar con la
257 IP y puerto indicados.
259 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
260 * de la forma www.gopher.net
261 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
262 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
263 automatica de la conexion.
264 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
266 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
267 \param doConnect Realiza o ignora, la conexion del recurso creado.
268 \return La instancia de comm::Server asociado al IP y puerto recibido.
269 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
271 Server* resolveServer(const char* hostname, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
272 throw(RuntimeException);
275 Crea la instancia de un anna::comm::Server disponible para conectar con la
276 IP y puerto indicados.
278 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
279 * de la forma www.gopher.net
280 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
281 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
282 automatica de la conexion.
283 \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
284 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
286 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
287 \param doConnect Realiza o ignora, la conexion del recurso creado.
288 \return La instancia de comm::Server asociado al IP y puerto recibido.
289 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
291 Server* resolveServer(const char* hostname, const int remotePort, const bool autoRecovery, ReceiverFactory& receiverFactory, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
292 throw(RuntimeException);
296 * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
297 * \param ip Dirección IP en formato a.b.c.d
298 * \param port Puerto de la dirección de red.
299 * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
301 INetAddress getINetAddress(const char* ip, const int port) throw(RuntimeException);
304 * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
305 * \param ip Dirección IP en formato a.b.c.d
306 * \param port Puerto de la dirección de red.
307 * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
309 INetAddress getINetAddress(const std::string& ip, const int port) throw(RuntimeException);
313 Devuelve una cadena con la informacin referente a esta instancia.
314 \param parent Nodo XML del que dependende la informacion.
315 @return Una cadena con la informacin referente a esta instancia.
317 xml::Node* asXML(xml::Node* parent) const throw();
320 host_container a_hosts;
321 device_container a_devices;
323 Device* a_cacheDevice;
325 Network() : a_cacheHost(NULL), a_cacheDevice(NULL) {;}
326 Network(const Network&);
328 friend class Singleton<Network>;