1 // ANNA - Anna is Not Nothingness Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // http://redmine.teslayout.com/projects/anna-suite
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
17 // * Neither the name of the copyright holder nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_comm_Network_hpp
38 #define anna_comm_Network_hpp
40 #include <netinet/in.h>
44 #include <anna/core/Singleton.hpp>
46 #include <anna/comm/INetAddress.hpp>
59 class TransportFactory;
60 class ReceiverFactory;
63 Representacion logica de la estructura de red donde se ejecuta nuestra aplicacion.
65 class Network : public Singleton <Network> {
68 * Modo de actuar a la hora de crear una conexión mediante #createConnection o #resolveConnection.
69 * \li Si el modo es \em Unique y ya existe una instancia previa conectada a una IP puerto se devuelve esa misma
71 * \li Si el modo es \em Multiple se pueden abrir tantas conexiones como se deseé sobre una misma IP:port.
73 struct Port { enum _v { Unique, Multiple }; };
74 struct DoConnect { enum _v { Yes, No }; };
77 typedef std::vector <Host*> host_container; /**< Definicion para gestionar las maquinas */
78 typedef host_container::iterator host_iterator; /**< Definicion para el iterador de maquinas */
79 typedef host_container::const_iterator const_host_iterator; /**< Definicion para el iterador de maquinas */
81 typedef std::vector <Device*> device_container; /**< Definicion para gestionar los dispositivos de red */
82 typedef device_container::iterator device_iterator; /**< Definicion para el iterador de dispositivos de red */
83 typedef device_container::const_iterator const_device_iterator; /**< Definicion para el iterador de dispositivos de red */
86 Devuelve un puntero al dispositivo que coincide con la direccion IP
87 recibida como parametro. Si no encuentra ninguna coincidencia se creara automaticamente.
89 @param address Direccion de la maquina buscada.
91 @return La instancia del dispositivo que coincide con la direccion IP recibida como parametro.
93 Device* find(const in_addr_t& address) throw();
96 Devuelve un iterador al comienzo de la lista de dispositivos de red.
97 \return un iterador al comienzo de la lista de dispositivos de red.
99 const_device_iterator device_begin() const throw() { return a_devices.begin(); }
102 Devuelve un iterador al final de la lista de dispositivos de red.
103 \return un iterador al final de la lista de dispositivos de red.
105 const_device_iterator device_end() const throw() { return a_devices.end(); }
108 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
110 \param ii Iterador que estamos recorriendo.
111 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
114 static const Device* device(const_device_iterator ii) throw() { return *ii; }
117 Devuelve un iterador al comienzo de la lista de dispositivos de red.
118 \return un iterador al comienzo de la lista de dispositivos de red.
120 device_iterator device_begin() throw() { return a_devices.begin(); }
123 Devuelve un iterador al final de la lista de dispositivos de red.
124 \return un iterador al final de la lista de dispositivos de red.
126 device_iterator device_end() throw() { return a_devices.end(); }
129 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
131 \param ii Iterador que estamos recorriendo.
132 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
135 static Device* device(device_iterator ii) throw() { return *ii; }
138 Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
139 maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
140 con este nombre se creara.
142 @param name Nombre logico de la maquina.
144 @return La instancia de la maquina asociada al nombre recibido.
146 Host* find_host(const char* name) throw();
149 Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
150 maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
151 con este nombre se creara.
153 @param name Nombre logico de la maquina.
155 @return La instancia de la maquina asociada al nombre recibido.
157 Host* find_host(const std::string& name) throw() { return find_host(name.c_str()); }
160 * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
161 * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
162 * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
163 * direcciones IP's retornadas por el sistema.
165 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
166 * de la forma www.gopher.net
168 * \return Si el nombre de host ho ha sido definido previamente mediante
169 * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
170 * direcciones IP's retornadas por el sistema
172 * \see man gethostbyname.
174 Host* resolve(const char* hostname) throw(RuntimeException);
177 * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
178 * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
179 * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
180 * direcciones IP's retornadas por el sistema.
182 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
183 * de la forma www.gopher.net
185 * \return Si el nombre de host ho ha sido definido previamente mediante
186 * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
187 * direcciones IP's retornadas por el sistema
189 * \see man gethostbyname.
191 Host* resolve(const std::string& hostname) throw(RuntimeException) { return resolve(hostname.c_str()); }
194 Devuelve un iterador al comienzo de la lista de maquinas no modificables.
195 \return Un iterador al comienzo de la lista de maquinas no modificables.
197 const_host_iterator host_begin() const throw() { return a_hosts.begin(); }
200 Devuelve un iterador al final de la lista de maquinas no modificables.
201 \return Un iterador al final de la lista de maquinas no modificables.
203 const_host_iterator host_end() const throw() { return a_hosts.end(); }
206 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
208 \param ii Iterador que estamos recorriendo.
209 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
212 static const Host* host(const_host_iterator ii) throw() { return *ii; }
215 Devuelve un iterador al comienzo de la lista de maquinas no modificables.
216 \return Un iterador al comienzo de la lista de maquinas no modificables.
218 host_iterator host_begin() throw() { return a_hosts.begin(); }
221 Devuelve un iterador al final de la lista de maquinas no modificables.
222 \return Un iterador al final de la lista de maquinas no modificables.
224 host_iterator host_end() throw() { return a_hosts.end(); }
227 Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
229 \param ii Iterador que estamos recorriendo.
230 \return un puntero al elemento sobre el que se encuentra el iterador pasado como
233 static Host* host(host_iterator ii) throw() { return *ii; }
236 Crea la instancia de un anna::comm::Server disponible para conectar con la
237 IP y puerto indicados.
239 \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
240 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
241 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
242 automatica de la conexion.
243 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
245 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
246 \param doConnect Realiza o ignora, la conexion del recurso creado.
247 \return La instancia de comm::Server asociado al IP y puerto recibido.
248 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
250 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)
251 throw(RuntimeException);
254 Crea la instancia de un anna::comm::Server disponible para conectar con la
255 IP y puerto indicados.
257 \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
258 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
259 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
260 automatica de la conexion.
261 \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
262 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
264 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
265 \param doConnect Realiza o ignora, la conexion del recurso creado.
266 \return La instancia de comm::Server asociado al IP y puerto recibido.
267 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
269 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)
270 throw(RuntimeException);
273 // Devuelve la instancia del anna::comm::Server asociado a la IP y puerto recibidos.
275 // \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
276 // \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
278 // \return La instancia de comm::Server asociado al IP y puerto recibido.
279 // \warning El anna::comm::Server devuelto puede ser NULL.
281 // Server* findServer (const char* ip, const int remotePort) throw (RuntimeException);
284 Crea la instancia de un anna::comm::Server disponible para conectar con la
285 IP y puerto indicados.
287 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
288 * de la forma www.gopher.net
289 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
290 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
291 automatica de la conexion.
292 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
294 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
295 \param doConnect Realiza o ignora, la conexion del recurso creado.
296 \return La instancia de comm::Server asociado al IP y puerto recibido.
297 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
299 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)
300 throw(RuntimeException);
303 Crea la instancia de un anna::comm::Server disponible para conectar con la
304 IP y puerto indicados.
306 * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
307 * de la forma www.gopher.net
308 \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
309 \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
310 automatica de la conexion.
311 \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
312 \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
314 \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
315 \param doConnect Realiza o ignora, la conexion del recurso creado.
316 \return La instancia de comm::Server asociado al IP y puerto recibido.
317 \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
319 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)
320 throw(RuntimeException);
324 * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
325 * \param ip Dirección IP en formato a.b.c.d
326 * \param port Puerto de la dirección de red.
327 * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
329 INetAddress getINetAddress(const char* ip, const int port) throw(RuntimeException);
332 * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
333 * \param ip Dirección IP en formato a.b.c.d
334 * \param port Puerto de la dirección de red.
335 * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
337 INetAddress getINetAddress(const std::string& ip, const int port) throw(RuntimeException);
341 Devuelve una cadena con la informacin referente a esta instancia.
342 \param parent Nodo XML del que dependende la informacion.
343 @return Una cadena con la informacin referente a esta instancia.
345 xml::Node* asXML(xml::Node* parent) const throw();
348 host_container a_hosts;
349 device_container a_devices;
351 Device* a_cacheDevice;
353 Network() : a_cacheHost(NULL), a_cacheDevice(NULL) {;}
354 Network(const Network&);
356 friend class Singleton<Network>;