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_Communicator_hpp
10 #define anna_comm_Communicator_hpp
14 #include <anna/config/defines.hpp>
15 #include <anna/core/DataBlock.hpp>
16 #include <anna/core/util/Recycler.hpp>
17 #include <anna/core/util/SortedVector.hpp>
19 #include <anna/app/Component.hpp>
21 #include <anna/comm/INetAddress.hpp>
22 #include <anna/comm/Socket.hpp>
23 #include <anna/comm/Status.hpp>
25 #include <anna/comm/internal/ConnectionRecover.hpp>
27 #include <anna/core/util/Millisecond.hpp>
45 class LocalConnection;
46 class RemoteConnection;
53 class ConnectionRecover;
56 class LocalConnection;
57 class RemoteConnection;
65 Clase que integra todos los elementos implicados en la recepcin y/o envio y tratamiento de mensajes
68 Los mensajes recibidos y/o enviados a la capa de transporte seran tratados por el protocolo asociado
69 al socket cliente. Normalmente todos los socket clientes asociados a un comunicador tendran asociado
70 un mismo tipo de protocolo. Ver Transport.
72 Normalmente, y una vez que recibimos un mensaje (ver #eventReceiveMessage) aplicaremos algun codec (ver @ref Codec)
73 para interpretar el contenido del mensaje, de forma analoga, para enviar un mensaje a la capa de transporte
74 usando cualquier protocolo lo normal sera haber codificado cierta informacion usando algun codec.
76 \warning Siempre que usemos un Communicator debemos establecer una clase Application heredada
79 class Communicator : public app::Component {
80 struct SortByFileDescriptor {
81 static int value(const Handler*) throw();
85 * Tamaño del búfer usado para leer los mensajes de la red.
86 * Se puede establecer desde comm::Communicator::setReceivingChunkSize.
88 static Millisecond st_ReceivingChunkSize;
92 * Modo de aceptar peticiones en el caso de una arquitectura ST.
93 * \warning Solo tiene efecto en caso de generar la libreria en modo ST.
99 * Un único proceso atiende todas las peticiones, el reparto de atención implementado asegura que todos
100 * los clientes tendrán un tiempo de respuesta similar, el tratamiento de N peticiones que llegan simultáneamente
101 * se realiza de forma secuencial. Es el modo usado hasta ahora en modo ST. Tiene la ventaja de ser el método que
102 * origina código más simple y fácil de mantener.
106 * Cada cliente tiene su propia copia del servidor original que trata sus peticiones de forma particular.
107 * De esta forma se podrían llegar a servir simultáneamente cada una de las peticiones de cada uno de los
108 * clientes conectados al servidor. Puede ser una buena opción si tenemos en cuenta la relación entre el
109 * rendimiento y la complejidad de desarrollo.
111 * Podria ser la mejor opcion para implementar un servidor de base de datos.
113 * \warning Solo puede usarse para implementar servidores finales, es decir, procesos que no requieran de la
114 * respuesta de ningun otro proceso remoto para realizar su operacion.
121 * Numero de mínimo milisegundos esperados para intentar la recuperacion de la conexion con los
122 * servidores en caso de detectar algun error.
124 static const Millisecond MinRecoveryTime;
127 Numero de milisegundos esperados para intentar la recuperacion de la conexion con los
128 servidores en caso de detectar algun error.
130 static const Millisecond DefaultRecoveryTime;
133 * Numero de mínimo milisegundos esperados para intentar la recuperacion de la conexion con los
134 * servidores en caso de detectar algun error.
136 static const Millisecond MaxRecoveryTime;
139 * Periodo de tiempo mínimo que estará intentando conectar con servidores cada vez que se cumpla el periodo de
140 * comprobación de conexiones.
142 static const Millisecond MinTryingConnectionTime;
145 * Periodo de tiempo usado por defectoque estará intentando conectar con servidores cada vez que se cumpla el
146 * periodo de comprobación de conexiones.
148 static const Millisecond DefaultTryingConnectionTime;
151 * Periodo de tiempo máximo que estará intentando conectar con servidores cada vez que se cumpla el periodo de
152 * comprobación de conexiones.
154 static const Millisecond MaxTryingConnectionTime;
157 * Tamaño mínimo de la cola de entrada de mensajes que se puede establecer.
159 static const int MinReceivingChunkSize = 2 * 1024;
162 * Tamaño máximo de la cola de entrada de mensajes que se puede establecer.
164 static const int MaxReceivingChunkSize = 64 * 1024;
167 Numero de milisegundos esperados para considerar que un cliente remoto ha abandonado
170 static const Millisecond DefaultTimeout;
173 * Tamaño máximo del búfer a tratar de forma ininterrumpida.
175 static const int DefaultChunkSize = 16 * 1024;
177 typedef SortedVector <Handler, SortByFileDescriptor> Handlers; /**< Definicion para gestionar los controladores asociados a este comunicador */
178 typedef Handlers::const_iterator const_handler_iterator; /**< Definicion para el iterador de controladores */
179 typedef Handlers::iterator handler_iterator; /**< Definicion para el iterador de controladores */
181 typedef std::vector <const Service*> Services; /**< Definicion para gestionar los servicios asociados a este comunicador */
182 typedef Services::const_iterator const_service_iterator; /**< Definicion para el iterador de servicios */
186 \param acceptMode Modo en que se trata las peticiones.
188 Communicator(const WorkMode::_v acceptMode = WorkMode::Single);
193 virtual ~Communicator();
196 Devuelve el numero de segundos esperado para intentar recuperar las conexiones de los servidores
197 con los que se han detectado errores de conexion.
198 @return El numero de segundos esperado para intentar recuperar las conexiones de los servidores
199 con los que se han detectado errores de conexion.
201 const Millisecond &getRecoveryTime() const throw() { return a_recoveryTime; }
204 Devuelve el estado de este proceso con respecto al sistema de comunicaciones.
205 \return El estado de este proceso con respecto al sistema de comunicaciones.
207 const Status& getStatus() const throw() { return a_status; }
210 Devuelve el numero de milisegundos maximo que puede estar un manejador de conexion local
211 sin recibir mensajes antes de ser cerrado por el nucleo.
212 \return el numero de milisegundos maximo que puede estar un manejador de conexion local
213 sin recibir mensajes antes de ser cerrado por el nucleo.
215 const Millisecond &getTimeout() const throw() { return a_timeout; }
218 * Devuelve el modo de tratamiento de conexiones establecido en el constructor.
220 WorkMode::_v getWorkMode() const throw() { return a_workMode; }
223 Devuelve \em true si este comunicador esta atendiendo peticiones como servidor o \em false en otro
225 @return \em true si este comunicador esta atendiendo peticiones como servidor o \em false en otro
228 bool isServing() const throw() { return a_isServing; }
231 Devuelve el estado del indicador de peticion de parada.
232 \return el estado del indicador de peticion de parada.
234 bool hasRequestedStop() const throw() { return a_requestedStop; }
237 * Informa al comunicador de que hay algún socket que ha solicitado el cierre de la conexión.
239 void notifyPendingClose() throw() { a_pendingClose = true; }
242 Establece el numero de milisegundos esperado para intentar recuperar las conexiones de los servidores
243 con los que se han detectado errores de conexion.
245 @param recoveryTime numero de milisegundos esperado para intentar recuperar las conexiones de los
246 servidores con los que se han detectado errores de conexion.
248 \warning el valor indicado deberá estar entre #MinRecoveryTime y #MaxRecoveryTime
250 void setRecoveryTime(const Millisecond &recoveryTime) throw(RuntimeException);
253 Establece el numero de milisegundos empleados en intentar conectar con los servidores caídos cada
254 vez que se cumple el periodo de recuperación y hay servidores caídos.
256 @param tryingConnectionTime numero de milisegundos empleados en intentar recuperar las conexiones
257 de los servidores con los que se han detectado errores de conexion.
259 \warning el valor indicado deberá estar entre #MinTryingConnectionTime y #MaxTryingConnectionTime
261 void setTryingConnectionTime(const Millisecond &tryingConnectionTime) throw(RuntimeException);
264 * Devuelve el numero de milisegundos empleados en intentar conectar con los servidores caídos.
266 const Millisecond &getTryingConnectionTime() const throw() { return a_tryingConnectionTime; }
269 * Establece el tamaño del bloque de memoria usado para procesar los mensajes entrantes. Todos
270 * los mensajes completos contenidos en el chunk se procesarán de forma ininterrumpida.
271 * \param receivingChunkSize Número de bytes a leer/procesar de forma ininterrumpida.
273 * \warning el valor indicado deberá estar entre #MinReceivingChunkSize y #MaxReceivingChunkSize
274 * \warning Experimentalmente se ha comprobado que los mejores rendimientos se obtiene cuando
275 * este valor y el MaxPendingBytes del control de congestión tiene valores cercanos, así que
276 * cuando se cambia este valor también se invocará a CongestionController::setMaxPendingBytes para
277 * establecer este mismo valor.
279 static void setReceivingChunkSize(const int receivingChunkSize) throw(RuntimeException);
282 * Obtiene el tamaño máximo del bloque de memoria a procesar de forma ininterrumpida.
283 * \return el tamaño máximo del bloque de memoria a procesar de forma ininterrumpida.
285 static int getReceivingChunkSize() throw() { return st_ReceivingChunkSize; }
288 Establece el numero de milisegundos maximo que puede estar un manejador de conexion local
289 sin recibir mensajes antes de ser cerrado por el nucleo.
290 \param timeout Numero de milisegundos maximo sin recibir mensajes.
292 void setTimeout(const Millisecond & timeout) throw() { a_timeout = timeout; }
295 * Establece el nivel de congestión global a partir del cual un servidor no aceptará nuevas conexiones. Su valor
296 * por defecto será comm::CongestionController::MaxLevel.
298 * \param levelOfDenialService Nivel de congestión global a partir del cual no se permitirán nuevas conexiones.
300 * \warning Debe estar entre [comm::CongestionController::MaxLevel - 2, comm::CongestionController::MaxLevel].
302 void setLevelOfDenialService(const int levelOfDenialService) throw(RuntimeException);
305 * Devuelve el nivel de congestión a partir del cual un servidor no aceptará nuevas conexiones.
306 * \return el nivel de congestión a partir del cual un servidor no aceptará nuevas conexiones.
308 int getLevelOfDenialService() const throw() { return a_levelOfDenialService; }
311 Registra un servidor de socket a la lista de peticiones por las que atiende peticiones este
312 Communicator. Un Communicator puede atender peticiones por un numero indeterminado de direcciones
313 lo que nos permite disear facilmente sistemas tolerantes a fallos.
315 \param serverSocket Servidor de socket por el que vamos a atender el establecimiento de conexiones
316 una vez que invoquemos al Metodo #accept.
318 void attach(ServerSocket* serverSocket) throw(RuntimeException);
321 Registra una conexion Local entre alguno de los ServerSocket definidos en nuestra aplicacion
322 y algun cliente remoto que solicita la conexion.
324 Antes de pasar a gestionar esta conexion debera de haber sido acceptada en el metodo
325 #eventAcceptConnection (a no ser que re-escribamos su comportamiento aceptara conexiones
326 de cualquier cliente).
328 \param localConnection Instancia de la conexion local que vamos a controlar.
330 \warning Exclusivamente uso interno
332 void attach(LocalConnection* localConnection) throw(RuntimeException);
335 Establece la conexion entre el comunicador y un ClientSocket recibido como parametro.
336 El socket recibido se inicializa se fuera necesario.
338 \param clientSocket Instancia del socket que vamos a controlar.
340 void attach(ClientSocket* clientSocket) throw(RuntimeException);
343 Establece la conexion entre el comunicador y un DatagramSocket recibido como parametro.
344 El socket recibido se inicializa se fuera necesario.
346 \param datagramSocket Instancia del socket que vamos a controlar.
348 void attach(DatagramSocket* datagramSocket) throw(RuntimeException);
351 Conecta un conector externo a este comunicador.
352 \param handler Controlador de comunicaciones externas.
353 \warning Debe de haber sido creado como de tipo Handler::Type::Custom.
355 void attach(Handler* handler) throw(RuntimeException);
358 Conecta un servicio de reparto de comunicaciones con este comunicador. El estado de
359 disponibilidad/indisponibilidad de este comunicador estara definido en base a la
360 disponibilidad de todos los servicios definidos como criticos.
361 \param service Instancia del servicio.
362 \warning Todos los servicios registrados como criticos deberian estar asociados al comunicador.
364 void attach(Service* service) throw(RuntimeException);
367 Desconecta el ServerSocket que fue previamente conectado con #attach
368 \param serverSocket Instancia del socket que vamos a desconectar.
369 \warning Este metodo es invocado automaticamente desde el nucleo de anna.comm y no deberia
370 ser usado por el programador final.
372 void detach(ServerSocket* serverSocket) throw();
375 Desconecta el ClientSocket que fue previamente conectado con #attach
376 \param clientSocket Instancia del socket que vamos a desconectar.
377 \warning Este metodo es invocado automaticamente desde el nucleo de ANNA.comm y no deberia
378 ser usado por el programador final.
380 void detach(ClientSocket* clientSocket) throw();
383 Desconecta el conector externo de este comunicador. Supone que todas las operaciones
384 adicionales necesarias para liberar los recursos de este fichero seran realizadas
387 \param handler Controlador de comunicaciones externas.
389 \warning Exclusivamente uso interno
391 void detach(Handler* handler) throw();
394 Devuelve el manejador asociado al ClientSocket recibido como parametro.
395 \param clientSocket Socket cliente del que queremos obtener en handler.
396 \return El manejador asociado al socket recibido como parametro. Puede ser NULL.
398 const Handler* getHandler(const ClientSocket& clientSocket) throw(RuntimeException);
401 El thread que invoca a este Metodo entra en un proceso continuo de comprobacin/recepcin
402 de mensajes, todos los eventos que pueden afectar al comportamiento de nuestro comunicador como son
403 aceptacin y cierre de conexiones, caidas, recepcin de mensajes, etc, etc se notifican a
404 traves de los Metodos manejadores de eventos de esta misma clase.
405 El thread saldra de este bucle tras la invocacion del Metodo #requestStop.
407 void accept() throw(RuntimeException);
410 Solicita la parada de este comunicador.
412 void requestStop() throw();
415 Devuelve \em true si el ClientSocket recibido como parametro sigue siendo valido o \em false
416 en caso de que haya dejado de ser valido debido al cierre del extremo remoto, por ejemplo.
418 Si el ClientSocket recibido es NULL siempre devolvera \em false.
420 \return \em true si el ClientSocket recibido como parametro sigue siendo valido o \em false
421 en caso de que haya dejado de ser valido debido al cierre del extremo remoto, por ejemplo.
423 bool isUsable(const ClientSocket* clientSocket) throw();
426 Devuelve el numero handlers activos.
427 \return el numero handlers activos.
429 int handler_size() const throw() { return a_handlers.size(); }
432 Devuelve un iterador que apunta el primer controlador.
433 \return un iterador que apunta el primer controlador.
435 handler_iterator handler_begin() throw() { return a_handlers.begin(); }
438 Devuelve un iterador que apunta al final de la lista de controladores.
439 \return un iterador que apunta al final de la lista de controladores.
441 handler_iterator handler_end() throw() { return a_handlers.end(); }
444 Devuelve un iterador que apunta el primer controlador.
445 \return un iterador que apunta el primer controlador.
447 const_handler_iterator handler_begin() const throw() { return a_handlers.begin(); }
450 Devuelve un iterador que apunta al final de la lista de controladores.
451 \return un iterador que apunta al final de la lista de controladores.
453 const_handler_iterator handler_end() const throw() { return a_handlers.end(); }
456 Devuelve un iterador que apunta el primer servicio.
457 \return un iterador que apunta el primer service.
459 const_service_iterator service_begin() const throw() { return a_services.begin(); }
462 Devuelve un iterador que apunta al final de la lista de servicios.
463 \return un iterador que apunta al final de la lista de servicios.
465 const_service_iterator service_end() const throw() { return a_services.end(); }
468 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador ante
469 un evento generado por el propio programador.
471 Sera invocado por algun Metodo del programador con el objetivo de actuar sobre su comunicador
472 en una situacin indeterminada.
474 La interpretacin del identificador y el contenido de este contexto sera problema exclusivo
475 del programador ya que ANNA.comm no impone ninguna regla ni realiza ningn tipo de proceso
476 adicional con estos datos.
478 @param id Identifica el evento generado.
479 @param context Contexto asociado al evento que ha generado el usuario.
481 \warning Este Metodo no debera generar ningn tipo de excepcin.
483 virtual void eventUser(const char* id, const void* context) throw() {;}
486 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
487 el nucleo de ANNA.comm notifica la perdida de conexion con la direccion IP indicada.
489 \param address Interfaz de red que ha dejado de estar disponible.
492 \li La forma en que detectara la caida del interfaz de red no esta dentro del ambito
493 del problema de ANNA.comm debera haber una capa superior que se encargue de comprobar las
495 \li El nucleo de ANNA.comm necesita conocer este evento por lo que cualquier implementacin
496 debera invocar al Metodo eventBreakAddress de su clase base.
498 virtual void eventBreakAddress(const in_addr_t& address) throw();
501 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
502 el nucleo de ANNA.comm notifica la recuperacin de conexion con la direccion IP indicada.
504 \param address Interfaz de red que ha vuelto a estar disponible.
507 \li La forma en que detectara la recuperacin del interfaz de red no esta dentro del ambito
508 del problema de ANNA.comm debera haber una capa superior que se encargue de comprobar las
510 \li El nucleo de ANNA.comm necesita conocer este evento por lo que cualquier implementacin
511 debera invocar al Metodo eventRecoverAddress de su clase base.
513 virtual void eventRecoverAddress(const in_addr_t& address) throw();
516 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
517 el nucleo de ANNA.comm notifica que ha detectado una peticion de conexion desde un
518 proceso remoto a un ServerSocket asociado a este comunicador.
519 Cualquier re-implementacion de este metodo debe invocar al metodo de la clase base y
520 devolver \em false en caso de que este lo devuelva.
522 @param clientSocket Socket cliente que solicita acceso.
524 \return \em true si la conexion es acceptada a \em false en otro caso, en cuyo caso se liberaran
525 automaticamente todos los recursos asociados a la peticion de conexion.
527 \warning Desde ANNA.comm 1.11.18 se mide el nivel de carga del proceso y si se evalúa como
528 congestionado no permitirá aceptar la nueva conexión.
530 virtual bool eventAcceptConnection(const ClientSocket& clientSocket) throw(RuntimeException);
533 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
534 el nucleo de ANNA.comm notifica la creacion de una nueva conexion con el proceso servidor
535 recibido como parametro.
537 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
538 todas las operaciones necesarias.
540 \warning Cualquier reimplementacion de este metodo debe comenzar invocando al metodo original de la
541 clase Communicator de la que herede nuestra clase.
543 @param server Proceso servidor con el que hemos establecido la conexion.
545 \see Host::createServer
547 virtual void eventCreateConnection(const Server* server) throw();
550 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
551 el nucleo de ANNA.comm notifica la creacion de una nueva conexion con el servicio de reparto
552 recibido como parametro.
554 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
555 todas las operaciones necesarias.
557 \warning Cualquier reimplementacion de este metodo debe comenzar invocando al metodo original de la
558 clase Communicator de la que herede nuestra clase.
560 @param service Servicio con el que hemos establecido la conexion.
562 \see Host::createServer
564 virtual void eventCreateConnection(const Service* service) throw();
567 Establece las acciones a realizar cuando la clase Communicator detecta la llegada de un
568 mensaje completo analizado con el protocolo indicado.
570 Se invocara desde el Metodo #accept cuando se detecta la llegada de un mensaje.
572 En entorno MT todos los threads actuaran sobre la unica instancia del comm::Communicator
573 lo que restara eficacia debido al bajo nivel de paralelismo.
575 @param clientSocket Socket cliente por el que ha llegado el mensaje.
576 @param message Ultimo mensaje recibido. El bloque de datos recibido ya ha sido
577 decodificado aplicando las reglas establecidas por la capa de transporte asociado
578 al ClientSocket por el que llega el mensaje.
580 \warning Para ANNA.comm version 1.5.2 y posteriores se deberian usar el sistema de
581 receiveres (anna::comm::Receiver) que ofrece mayor rendimiento y facilita la programacion
584 virtual void eventReceiveMessage(ClientSocket& clientSocket, const Message& message)
585 throw(RuntimeException) { ; }
588 Establece las acciones a realizar cuando el nucleo de ANNA.comm notifica que ha
589 cerrado un anna::comm::ClientSocket debido a un consumo excesivo de memoria.
590 \param clientSocket Socket cliente que va a ser cerrado por el nucleo de ANNA.comm.
592 virtual void eventOverQuota(const ClientSocket& clientSocket) throw() {;}
595 Establece las acciones a realizar cuando el núcleo de ANNA.comm notifica que ha
596 cerrado un anna::comm::ClientSocket debido a que ha recibido un mensaje que no
597 ha sido analizado correctamente.
598 \param clientSocket Socket cliente que va a ser cerrado por el nucleo de ANNA.comm.
600 virtual void eventDiscardConnection(const ClientSocket& clientSocket) throw() {;}
603 * Método manejador invocado cuando un client socket que tiene activado el indicador de ignorar los
604 * mensajes entrantes recibe un mensaje.
605 * \param clientSocket ClientSocket por el que se recibe el mensaje.
606 * \param burst Bloque de datos que contiene la trama recibida.
608 virtual void eventIgnoreBurst(const ClientSocket& clientSocket, const DataBlock& burst) throw() {;}
611 Devuelve una cadena con la informacion mas relevante de esta instancia.
612 \return Una cadena con la informacion mas relevante de esta instancia.
614 std::string asString() const throw();
617 Devuelve un documento XML con la informacion mas relevante de esta instancia.
618 \param parent Nodo XML del que colgar la informacion referente a esta instancia.
619 \return Un documento XML con la informacion mas relevante de esta instancia.
621 virtual xml::Node* asXML(xml::Node* parent) const throw();
624 Devuelve el controlador apuntado por el iterador recibido.
625 \param ii Iterador con el que estamos recorriendo los controladores.
626 \return el controlador apuntado por el iterador recibido.
628 static Handler* handler(handler_iterator& ii) throw() { return Handlers::data(ii); }
631 Devuelve el controlador apuntado por el iterador recibido.
632 \param ii Iterador con el que estamos recorriendo los controladores.
633 \return el controlador apuntado por el iterador recibido.
635 static const Handler* handler(const_handler_iterator& ii) throw() { return Handlers::data(ii); }
638 Devuelve el servicio apuntado por el iterador recibido.
639 \param ii Iterador con el que estamos recorriendo los servicios.
640 \return el servicio apuntado por el iterador recibido.
642 static const Service* service(const_service_iterator& ii) throw() { return *ii; }
645 Devuelve la cadena por la que podemos buscar el componente.
646 \return La cadena por la que podemos buscar el componente.
647 \see Application::find
649 static const char* getClassName() { return "anna::comm::Communicator"; }
653 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
654 el nucleo de ANNA.comm notifica la perdida de conexion con un servidor remoto.
656 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
657 todas las operaciones necesarias.
659 @param clientSocket Socket cliente asociado a esta rotura de conexion.
661 \warning despues de llamar a este Metodo el clientSocket pasado como parametro se liberara por lo
662 que despues de este Metodo esta instancia no debera utilizarse.
663 \warning Estado MT: \code [Tx] -> Communicator \endcode
665 virtual void eventBreakConnection(const ClientSocket& clientSocket) throw() {;}
668 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
669 el nucleo de ANNA.comm notifica la perdida de conexion de una conexion generada por un server socket.
671 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
672 todas las operaciones necesarias.
674 @param clientSocket Socket cliente asociado a esta rotura de conexion.
676 virtual void eventBreakLocalConnection(const ClientSocket& clientSocket) throw() {;}
680 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
681 el nucleo de ANNA.comm notifica la perdida de conexion con el proceso servidor recibido como
684 Se invocara desde #accept(ServerSocket&) cuando no se detecta la rotura de conexion con un
685 socket asociado a uno de nuestros servidores.
687 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
688 todas las operaciones necesarias.
690 Las acciones realizadas por este metodo incluyen:
691 \li Cierre del socket asociado al proceso servidor cuya conexion ha caido.
692 \li Reorganizacion del sistema de reparto de carga para que marque el proceso servidor como no disponible.
693 \li Activar los sistemas de recuperacion de conexion en el caso de que el servidor que ha caido
694 vuelva a estar disponible.
696 \warning Cualquier reimplementacion de este metodo debe comenzar invocando al metodo original de la
697 clase Communicator de la que herede nuestra clase.
698 \warning Estado MT: \code [Tx] -> Communicator \endcode
700 @param server Proceso servidor con el que hemos perdido la conexion.
702 virtual void eventBreakConnection(const Server* server) throw();
705 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador
706 cuando el nucleo de anna.comm notifica la perdida de conexion con todos los procesos
707 asociados al servicio recibido como parametro.
709 \param service Servicio que ha dejado de estar disponible.
710 \warning Estado MT: \code [Tx] -> Communicator \endcode
712 virtual void eventBreakConnection(const Service* service) throw();
715 Establecer la configuracin de este comunicador. El cargador de configuracin se encarga de establecer
716 los ServerSocket por los que este comunicador va a atender peticiones y/o los procesos servidores
717 remotos con los que tenemos que establecer el canal de comunicaciones.
719 \warning Este Metodo debe invocarse desde las clases heredadas.
721 virtual void do_initialize() throw(RuntimeException) {;}
724 Solicita la parada de este comunicador. Se reimplementa para mantener el interfaz de la clase
725 Component de la que hereda este Communicator.
727 void do_stop() throw() { requestStop(); }
730 Establece el estado de este proceso con respecto al sistema de comunicaciones
731 @param status Estado del sistema de comunicaciones que deseamos establecer.
733 virtual void setStatus(const Status& status) throw();
736 Establece la conexion entre el comunicador y un socket dedicado a la comparticion de una
737 determinada direccion IP:puerto.
739 \param binderSocket Define un socket por el que tratar las peticiones de comparticion
740 de una determinada direccion IP:puerto.
744 void attach(BinderSocket* binderSocket) throw(RuntimeException);
747 Desconecta el BinderSocket que fue previamente conectado con attach(BinderSocket*).
748 \param binderSocket Instancia del BinderSocket a desconectar.
749 \warning Exclusivamente uso interno
751 void detach(BinderSocket* binderSocket) throw();
754 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
755 el nucleo de ANNA.comm notifica que este comunicador esta preparado para comenzar a
756 aceptar y/o enviar mensajes.
758 Se invocara desde el metodo #accept inmediatamente antes de comenzar a
759 comprobar la llegada de mensajes.
761 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
762 todas las operaciones necesarias.
764 virtual void eventStartup() throw(RuntimeException) {;}
767 Metodo manejador de evento que permite ajustar el funcionamiento de nuestro comunicador cuando
768 el nucleo de ANNA.comm notifica que este va a dejar de atender peticiones.
770 En la mayoria de los casos no sera necesario indicar ninguna accion ya que ANNA.comm realiza
771 todas las operaciones necesarias.
773 virtual void eventShutdown() throw();
776 const WorkMode::_v a_workMode;
778 bool a_requestedStop;
780 Millisecond a_recoveryTime;
783 Millisecond a_timeout;
784 comm::Handler* a_mainHandler;
785 ConnectionRecover* a_connectionRecover;
787 Millisecond a_tryingConnectionTime;
788 int a_levelOfDenialService;
792 Handlers a_timedouts;
793 void singlethreadedAccept() throw(RuntimeException);
796 ThreadManager* a_threadManager;
797 void multithreadedAccept() throw(RuntimeException);
799 ConnectionRecover* getConnectionRecover() throw() { return a_connectionRecover; }
801 void attach(RemoteConnection* remoteConnection) throw(RuntimeException);
803 void insert(Handler*) throw(RuntimeException);
804 Handler* find(const int fd) throw() { return a_handlers.find(fd); }
806 // Reimplementado de app::Component
807 void do_cloneParent() throw(RuntimeException);
808 void do_cloneChild() throw();
810 friend class Handler;
813 // attach (RemoteConnection)
815 friend class handler::RemoteConnection;
816 // getConnectionRecover, eventBreakConnection
818 friend class handler::ClientSocket;
819 // eventBreakConnection
822 friend class handler::LocalConnection;
823 // eventBreakLocalConnection