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_Socket_hpp
10 #define anna_comm_Socket_hpp
13 #include <sys/socket.h>
16 #include <anna/config/defines.hpp>
17 #include <anna/core/mt/Mutex.hpp>
19 #include <anna/comm/INetAddress.hpp>
20 #include <anna/comm/AccessPoint.hpp>
32 class TransportFactory;
33 class ReceiverFactory;
36 Esta clase es la superclase de la que heredan todos los socket definidos en este paquete. Es usada tanto para
37 crear socket de la parte cliente y de la parte servidora.
39 class Socket : public Mutex {
42 Tipos de dominios soportados.
44 struct Domain { enum _v { Unix = PF_UNIX, Inet = PF_INET } ; };
47 Tipos de sockets soportados.
49 struct Type { enum _v { Stream = SOCK_STREAM, Datagram = SOCK_DGRAM, Raw = SOCK_RAW } ; };
52 Tipos de notificaciones que nos puede indicar el Socket.
57 None, /**< No hay actividad en el socket */
58 ReceiveData, /**< Datos recibidos */
59 Close, /**< El extremo remoto ha cerrado el socket */
60 Corrupt /**< El mensaje recibido no ha sido reconocido por la capa de transporte */
70 Devuelve el descriptor de fichero asociado a este socket.
71 @return El descriptor de fichero asociado a este socke. Si el socket no ha sido creado devolver�-1.
73 int getfd() const throw() { return a_fd; }
76 Devuelve el tipo de socket.
77 \return El tipo de socket.
79 Type::_v getType() const throw() { return a_type; }
82 Devuelve el dominio de este socket.
83 \return El dominio de este socket.
85 Domain::_v getDomain() const throw() { return a_domain; }
88 Devuelve la categoria asociada a este socket.
89 \return La categoria asociada a este socket.
91 int getCategory() const throw() { return a_category; }
94 Informa sobre si el socket es capaz de procesar un determinado protocolo de transporte.
95 \param transportClassName Normalmente se pasara el resultado del metodo \em className de
96 alguno de los protocolos definidos, por ejemplo, Transport::className o
97 LiteTransport::className
98 \return \em true si soporta el nombre de protocolo recibido como parametro o \em false
101 bool support(const char* transportClassName) const throw();
104 Devuelve el estado de la conexion de este socket.
106 @return \em true si el servidor de socket ha sido conectado o \em false en otro caso.
108 bool isBound() const throw() { return a_isBound; }
111 Devuelve el estado del socket.
112 @return \em true si el socket este abierto o \em false en otro caso.
114 bool isOpened() const throw() { return a_fd != -1; }
117 * Devuelve \em false si el socket usa un protocolo de comunicaciones seguro o \em false
119 * \return \em false si el socket usa un protocolo de comunicaciones seguro o \em false
122 virtual bool isSecure() const throw() { return false; }
125 Devuelve la direccion local del socket.
126 \return La direccion local del socket.
128 const AccessPoint& getLocalAccessPoint() const throw() { return a_localAccessPoint; }
131 Devuelve la factoria de la capa de transporte usada en este socket.
132 \return la factoria de la capa de transporte usada en este socket.
134 TransportFactory* getTransportFactory() const throw() { return a_transportFactory; }
137 Devuelve la factoria de receptores usada en este socket.
138 \return la factoria de receptores usada en este socket.
140 ReceiverFactory* getReceiverFactory() throw() { return a_receiverFactory; }
143 Activa o desactiva el modo de bloqueo.
144 \param blockingMode \em true si queremos activar el bloqueo o \em false en otro caso.
145 @return El modo de bloqueo establecido antes de invocar este masodo.
147 bool setBlockingMode(const bool blockingMode) throw(RuntimeException);
150 Activa o desactiva el modo de reuso de la direccion.
151 \param reuseMode \em true si queremos activar el reuso o \em false en otro caso.
152 \warning Solo servira para acelerar el uso del socket una vez que el proceso que lo tenia
153 halla dejado de funcionar.
154 \return El modo de reuso establecido antes de invocar a este metodo.
156 bool setReuseMode(const bool reuseMode) throw(RuntimeException);
159 Establece la capa de transporte usada en este socket.
160 \warning Exclusivamente uso interno.
162 void setTransportFactory(TransportFactory* transportFactory) throw() { a_transportFactory = transportFactory; }
165 Establece la factoria de receptores usada por este socket.
166 \param receiverFactory Factoria de receptores desde la que obtener el receptor asociado a este Socket.
168 void setReceiverFactory(ReceiverFactory& receiverFactory) throw() { a_receiverFactory = &receiverFactory; }
171 Establece la categoria de este socket.
172 La categoria es una concepto del ambito de la aplicacion que el nucleo de anna.comm
173 no usa para nada. Unicamente hay que tener en cuenta que todos los anna::comm::ClientSocket creados
174 a partir de un anna::comm::ServerSocket comparten su misma categoria.
175 \param category Categoria asociada a este socket.
177 void setCategory(const int category) throw() { a_category = category; }
180 Cierra este socket. Si el socket no ha sido creado no tendra ningn efecto.
182 void close() throw();
185 Intenta la asociar este socket con los parametros indicados en el constructor.
187 virtual void bind() throw(RuntimeException);
190 Devuelve una cadena con la informacion referente a este socket.
191 @return Una cadena con la informacion referente a este socket.
193 virtual std::string asString() const throw();
196 Devuelve un nodo XML con la informacion referente a este objeto.
197 \param parent Nodo XML a partir del cual introducir la informacion.
198 \return Un nodo XML con la informacion referente a este objeto.
200 virtual xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
203 const Domain::_v a_domain;
204 const Type::_v a_type;
206 AccessPoint a_localAccessPoint;
208 TransportFactory* a_transportFactory;
209 ReceiverFactory* a_receiverFactory;
213 Crea un servidor de socket liberado.
214 \param domain Dominio del socket.
215 \param type Tipo de socket.
216 \param transportFactory Factoria de protocolos de transporte a usar por este sockets. Si se indica
217 NULL ser usara el protocolo devuelto por anna::comm::Application::getDefaultTransportFactory.
218 \warning La factoria de protocolos debe estar disponible mientras el Socket este activo.
220 Socket(const Domain::_v domain, const Type::_v type, TransportFactory* transportFactory = NULL);
223 Crea un socket INET que sera asociado a la direccion y puerto locales indicados.
225 \param localAddress Puede ser usado para limitar la direccion por la que atendiende peticiones un servidor de socket
226 instalado en una maquina con mas de una direccion.
227 \param type Tipo de socket.
228 \param transportFactory Factoria de protocolos de transporte a usar por este sockets. Si se indica
229 NULL ser usara el protocolo devuelto por anna::comm::Application::getDefaultTransportFactory.
230 \warning La factoria de protocolos debe estar disponible mientras el Socket este activo.
232 Socket(const INetAddress& localAddress, const Type::_v type, TransportFactory* transportFactory = NULL);
235 Crea un socket UNIX que sera asociado al archivo indicado como parametro.
237 \param path Ruta del archivo que vamos a usar para transferir datos a traves de este socket.
238 \param type Tipo de socket.
239 \param transportFactory Factoria de protocolos de transporte a usar por este sockets. Si se indica
240 NULL ser usara el protocolo devuelto por anna::comm::Application::getDefaultTransportFactory.
242 Socket(const std::string& path, const Type::_v type, TransportFactory* transportFactory = NULL);
247 void open() throw(RuntimeException);
250 Cierra este socket. Si el socket no ha sido creado no tendra ningn efecto.
252 virtual void do_close() throw() { ::close(a_fd); }
255 Asocia este Socket a la direccion recibida como parametro.
256 \warning Exclusivamente uso interno.
258 virtual int do_bind(const struct sockaddr*, const int) throw(RuntimeException);
261 Devuelve la cadena correspondiente a la notificacion recibida como parametro.
262 \param v Codigo de notificacion.
263 \return La cadena correspondiente a la notificacion recibida como parametro.
265 static const char* asText(const Notify::_v v) throw();
271 #define anna_socket_assert(a,b) \
273 std::string msg (asString ()); \
276 throw RuntimeException (msg, __FILE__, __LINE__); \
279 #define anna_comm_socket_check(a,b) \
281 std::string msg (asString ()); \
284 throw RuntimeException (msg, errno, ANNA_FILE_LOCATION); \