ANNA Suite  2020b
Multipurpose development suite for Telco applications
ClientSocket.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
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 //
7 
8 
9 #ifndef anna_comm_ClientSocket_hpp
10 #define anna_comm_ClientSocket_hpp
11 
12 #include <anna/comm/Socket.hpp>
13 #include <anna/comm/Buffer.hpp>
14 #include <anna/comm/Transport.hpp>
16 
17 namespace anna {
18 
19 namespace comm {
20 
21 class Communicator;
22 class DatagramSocket;
23 class Transport;
24 class Message;
25 class Server;
26 class CongestionController;
27 class Receiver;
28 
29 namespace handler {
30 class MetaClientSocket;
31 class DatagramSocket;
32 }
33 
38 class ClientSocket : public Socket {
39 public:
45 
51 
59  ClientSocket(TransportFactory* transportFactory = NULL, Domain::_v domain = Socket::Domain::Inet, Type::_v type = Socket::Type::Stream) :
60  Socket(domain, type, transportFactory),
61  a_data(true),
62  a_reader(true),
63  a_ignoreIncomingMessages(false) {
64  initialize();
65  }
66 
75  ClientSocket(const INetAddress& remoteAddress, TransportFactory* transportFactory = NULL, const Type::_v type = Socket::Type::Stream) :
76  Socket(Socket::Domain::Inet, type, transportFactory),
77  a_remoteAccessPoint(remoteAddress),
78  a_data(true),
79  a_reader(true),
80  a_ignoreIncomingMessages(false) {
81  initialize();
82  }
83 
90  ClientSocket(const std::string& path, const Type::_v type = Socket::Type::Stream) :
91  Socket(path, type),
92  a_remoteAccessPoint(path),
93  a_data(true),
94  a_reader(true),
95  a_ignoreIncomingMessages(false) {
96  initialize();
97  }
98 
111  ClientSocket(const INetAddress& remoteAddress, const INetAddress& localAddress, TransportFactory* transportFactory = NULL, const Type::_v type = Socket::Type::Stream) :
112  Socket(localAddress, type, transportFactory),
113  a_remoteAccessPoint(remoteAddress),
114  a_data(true),
115  a_reader(true),
116  a_ignoreIncomingMessages(false) {
117  initialize();
118  }
119 
123  virtual ~ClientSocket() { close(); }
124 
129  const AccessPoint& getRemoteAccessPoint() const { return a_remoteAccessPoint; }
130 
136  bool isConnected() const { return (a_status & Status::Connected) != 0; }
137 
142  bool isSynchronized() const { return (a_status & Status::Corrupt) == 0; }
143 
148  bool isCorrupt() const { return (a_status & Status::Corrupt); }
149 
154  bool isClosedPending() const { return (a_status & Status::ClosePending) != 0; }
155 
164  Server* getServer() noexcept(false);
165 
172  const Millisecond &getMaxConnectionDelay() const { return a_msMaxConnectionDelay; }
173 
180  const Millisecond &getMaxWriteDelay() const { return a_msMaxWriteDelay; }
181 
188  virtual void setfd(const int fd) noexcept(false);
189 
197  void setMaxConnectionDelay(const Millisecond &msMaxConnectionDelay)
198  {
199  a_msMaxConnectionDelay = msMaxConnectionDelay;
200  }
201 
208  void setMaxWriteDelay(const Millisecond &msMaxWriteDelay) { a_msMaxWriteDelay = msMaxWriteDelay; }
209 
214  bool getIgnoreIncomingMessages() const { return a_ignoreIncomingMessages; }
215 
220  void setIgnoreIncomingMessages(const bool ignoreIncomingMessages) { a_ignoreIncomingMessages = ignoreIncomingMessages; }
221 
225  virtual void connect() noexcept(false);
226 
234  void send(Message& message) noexcept(false);
235 
243  void send(Message* message) noexcept(false);
244 
284  Notify::_v wait(const Millisecond &timeout, const bool receive = true) noexcept(false);
285 
289  void forgot() ;
290 
295  Transport* getTransport() noexcept(false) {
296  return (a_transport != NULL) ? a_transport : reserveTransport();
297  }
298 
304  Receiver* getReceiver() noexcept(false) {
305  return (a_receiver != NULL) ? a_receiver : ((a_receiverFactory == NULL) ? NULL : reserveReceiver());
306  }
307 
314  void setReceiver(Receiver* receive) noexcept(false);
315 
321  void requestClose() ;
322 
327  bool hasRequestedClose() const { return (a_status & Status::ClosePending) != 0; }
328 
333  virtual std::string asString() const ;
334 
340  virtual xml::Node* asXML(xml::Node* parent) const noexcept(false);
341 
346  static const char* className() { return "anna::comm::ClientSocket"; }
347 
348 protected:
349  struct Status {
350  enum _v { None = 0, Connected = 1, Corrupt = 2, ClosePending = 4, Working = 8 };
351 
352  static std::string asString(const int status) ;
353  };
354 
357 
362  int getBufferSize() const { return a_data.getSize() - a_offset; }
363 
368  int getReceiveBufferSize() const { return a_rcvBufferSize; }
369 
374  void getSocketOptions() noexcept(false);
375 
405  Notify::_v receive() noexcept(false);
406 
418  const DataBlock* fetch() noexcept(false);
419 
420  void activate(const Status::_v v) { a_status |= v; }
421  void deactivate(const Status::_v v) { a_status &= ~v; }
422  void deactivate(const int v) { a_status &= ~v; }
423 
424  virtual int do_connect(const sockaddr*, const int len) noexcept(false);
425  virtual void do_write(const DataBlock&) noexcept(false);
426  virtual int do_read(const char* data, const int size) noexcept(false);
427  virtual void do_close() ;
428 
429 private:
430  struct PendingBytes {
431  Millisecond validUntil;
432  int bytesToRead;
433 
434  PendingBytes() { validUntil = 0; bytesToRead = 0; }
435  };
436 
437  //-----------------------------------------------------------------------------------------
438  // a_status : Combinacion de bit's que indica el estado de la instancia.
439  // a_expectedSize: Numero de bytes esperados. valdra -1 si todavia no hay informacion
440  // para calcularlo.
441  // a_data: Ultimo bloque de datos leido. Puede contener un numero indeterminado de mensajes
442  // a_buffer: Referencia al espacio que ocupa el mensaje que estamos tratanto. Apunta
443  // a un espacio dentro de 'a_data'-
444  // a_reader: Buffer usado para leer los datos del Socket.
445  // a_offset: Desplazamiento que hay que aplicar sobre los datos contenidos en 'a_data'.
446  // a_cachedServer: Ultimo server calculado en el metodo getServer.
447  //-----------------------------------------------------------------------------------------
448  int a_status;
449  int a_expectedSize;
450  DataBlock a_data;
451  Buffer a_buffer;
452  DataBlock a_reader;
453  int a_offset;
454  comm::Server* a_cachedServer;
455  Millisecond a_msMaxConnectionDelay;
456  Millisecond a_msMaxWriteDelay;
457  int a_rcvBufferSize;
458  Receiver* a_receiver;
459  mutable PendingBytes a_pendingBytes;
460  bool a_ignoreIncomingMessages;
461 
462  void initialize() ;
463  void calculeExpectedSize(const DataBlock&) ;
464  Transport* reserveTransport() noexcept(false);
465  Transport* unsafe_reserveTransport() noexcept(false);
466  Receiver* reserveReceiver() noexcept(false);
467  int getTotalPendingBytes() const ;
468 
469  friend class Communicator;
470  // unsafe_reserveTransport
471 
472 
473  friend class CongestionController;
476 };
477 
478 }
479 }
480 
481 #endif
482 
Definition: INetAddress.hpp:34
bool isSynchronized() const
Definition: ClientSocket.hpp:142
bool isConnected() const
Definition: ClientSocket.hpp:136
Definition: Communicator.hpp:79
Definition: Millisecond.hpp:24
static const Millisecond DefaultMaxConnectionDelay
Definition: ClientSocket.hpp:44
void deactivate(const Status::_v v)
Definition: ClientSocket.hpp:421
const Millisecond & getMaxConnectionDelay() const
Definition: ClientSocket.hpp:172
Definition: MetaClientSocket.hpp:22
Definition: Server.hpp:53
Definition: DatagramSocket.hpp:24
void setMaxWriteDelay(const Millisecond &msMaxWriteDelay)
Definition: ClientSocket.hpp:208
Definition: Node.hpp:56
void setfd(const int fd)
Definition: Handler.hpp:168
Definition: Socket.hpp:44
Definition: Socket.hpp:44
Transport * getTransport() noexcept(false)
Definition: ClientSocket.hpp:295
static const char * className()
Definition: ClientSocket.hpp:346
const AccessPoint & getRemoteAccessPoint() const
Definition: ClientSocket.hpp:129
Definition: ClientSocket.hpp:38
Definition: CongestionController.hpp:63
Definition: Transport.hpp:44
int getReceiveBufferSize() const
Definition: ClientSocket.hpp:368
bool isClosedPending() const
Definition: ClientSocket.hpp:154
ClientSocket(TransportFactory *transportFactory=NULL, Domain::_v domain=Socket::Domain::Inet, Type::_v type=Socket::Type::Stream)
Definition: ClientSocket.hpp:59
Definition: ClientSocket.hpp:349
static const Millisecond DefaultMaxWriteDelay
Definition: ClientSocket.hpp:50
bool isCorrupt() const
Definition: ClientSocket.hpp:148
Definition: Buffer.hpp:22
Definition: Socket.hpp:49
Definition: Message.hpp:26
Receiver * getReceiver() noexcept(false)
Definition: ClientSocket.hpp:304
_v
Definition: ClientSocket.hpp:350
bool hasRequestedClose() const
Definition: ClientSocket.hpp:327
void setIgnoreIncomingMessages(const bool ignoreIncomingMessages)
Definition: ClientSocket.hpp:220
ClientSocket(const std::string &path, const Type::_v type=Socket::Type::Stream)
Definition: ClientSocket.hpp:90
Definition: Socket.hpp:39
int getBufferSize() const
Definition: ClientSocket.hpp:362
_v
Definition: Handler.hpp:48
bool getIgnoreIncomingMessages() const
Definition: ClientSocket.hpp:214
Definition: Receiver.hpp:33
Definition: app.hpp:12
void activate(const Status::_v v)
Definition: ClientSocket.hpp:420
ClientSocket(const INetAddress &remoteAddress, const INetAddress &localAddress, TransportFactory *transportFactory=NULL, const Type::_v type=Socket::Type::Stream)
Definition: ClientSocket.hpp:111
virtual ~ClientSocket()
Definition: ClientSocket.hpp:123
void deactivate(const int v)
Definition: ClientSocket.hpp:422
Definition: TransportFactory.hpp:30
AccessPoint a_remoteAccessPoint
Definition: ClientSocket.hpp:356
Transport * a_transport
Definition: ClientSocket.hpp:355
Definition: DataBlock.hpp:24
Definition: AccessPoint.hpp:37
ClientSocket(const INetAddress &remoteAddress, TransportFactory *transportFactory=NULL, const Type::_v type=Socket::Type::Stream)
Definition: ClientSocket.hpp:75
const Millisecond & getMaxWriteDelay() const
Definition: ClientSocket.hpp:180
void setMaxConnectionDelay(const Millisecond &msMaxConnectionDelay)
Definition: ClientSocket.hpp:197