TDME2  1.9.200
UDPClient.h
Go to the documentation of this file.
1 #pragma once
2 
3 #if defined(_WIN32) && defined(_MSC_VER)
4  #define ssize_t int
5 #endif
6 
7 #include <memory>
8 #include <queue>
9 #include <string>
10 #include <unordered_map>
11 
12 #include <tdme/tdme.h>
17 
22 
23 using std::unique_ptr;
24 using std::queue;
25 using std::string;
26 using std::unordered_map;
27 
32 
36 
37 /**
38  * UDP client
39  * @author Andreas Drewke
40  */
42 public:
44  int64_t time { -1LL };
45  uint32_t received { 0 };
46  uint32_t sent { 0 };
47  uint32_t errors { 0 };
48  };
49 
50  /**
51  * Get retry time for given retry count
52  * @param retries retry count
53  * @return approximatly retry time in ms
54  */
55  inline static uint64_t getRetryTime(const uint8_t retries) {
56  if (retries == 0) return 0L;
57  if (retries > UDPClient::MESSAGEACK_RESENDTIMES_TRIES) return 0L;
58  return UDPClient::MESSAGEACK_RESENDTIMES[retries - 1];
59  }
60 
61  // forbid class copy
63 
64  /**
65  * Public constructor
66  * @param ip server ip
67  * @param port server port
68  */
69  UDPClient(const string& ip, const uint16_t port);
70 
71  /**
72  * Destructor
73  */
74  ~UDPClient();
75 
76  /**
77  * @return initialized
78  */
79  inline bool isInitialized() {
80  return initialized;
81  }
82 
83  /**
84  * @return initialized
85  */
86  inline bool isConnected() {
87  return connected;
88  }
89 
90  /**
91  * @return server ip
92  */
93  inline const string& getIp() {
94  return ip;
95  }
96 
97  /**
98  * @return server port
99  */
100  inline const unsigned int getPort() {
101  return port;
102  }
103 
104  /**
105  * @return client key
106  */
107  inline const string& getClientKey() {
108  return clientKey;
109  }
110 
111  /**
112  * Set client key
113  * @param clientKey client key
114  */
115  inline void setClientKey(const string& clientKey) {
116  this->clientKey = clientKey;
117  }
118 
119  /**
120  * Returns if a message should be processed or already have been processed
121  * @param clientMessage client message
122  * @return if message should be processed or not
123  * @throws tdme::network::udpclient::NetworkClientException
124  */
125  bool processSafeMessage(UDPClientMessage* clientMessage);
126 
127  /**
128  * Receive message
129  * @return message or nullptr, needs to be deleted after processing
130  */
132 
133  /**
134  * Pushes a message to be send, takes over ownership of message
135  * @param clientMessage client message object
136  * @param safe safe
137  * @throws tdme::network::udpclient::NetworkClientException
138  */
139  void sendMessage(UDPClientMessage* clientMessage, bool safe);
140 
141  /**
142  * Create message
143  * @param packet UDP client packet
144  */
145  UDPClientMessage* createMessage(const UDPPacket* packet);
146 
147  /**
148  * @returns UDP client statistics
149  */
150  const UDPClient_Statistics getStatistics();
151 
152 private:
153  /**
154  * Run thread program
155  */
156  virtual void run();
157 
158  /**
159  * Processes ack reveived
160  * @param messageId message id
161  * @throws tdme::network::udpclient::NetworkClientException
162  */
163  void processAckReceived(const uint32_t messageId);
164 
165  /**
166  * Process ack messages
167  */
168  void processAckMessages();
169 
170  /**
171  * Clean up safe messages
172  */
173  void cleanUpSafeMessages();
174 
175  //
177  bool connected;
178  string ip;
179  uint16_t port;
180  uint32_t clientId;
181  uint32_t messageCount;
182  string clientKey;
183 
184  const static int MESSAGEACK_RESENDTIMES_TRIES = 7;
186  const static int MESSAGEQUEUE_SEND_BATCH_SIZE = 100;
187  const static uint64_t MESSAGEACK_KEEPTIME = 5000L;
188  struct Message {
189  uint64_t time;
190  uint8_t messageType;
191  uint32_t messageId;
192  uint8_t retries;
193  char message[512];
194  uint16_t bytes;
195  };
196  typedef queue<Message*> MessageQueue;
197  typedef unordered_map<uint32_t, Message*> MessageMapAck;
198  typedef queue<UDPClientMessage*> RecvMessageQueue;
199 
200  static const uint64_t MESSAGESSAFE_KEEPTIME = 5000L;
201  struct SafeMessage {
202  uint32_t messageId;
203  uint64_t time;
204  uint8_t receptions;
205  };
206  typedef unordered_map<uint32_t, SafeMessage*> MessageMapSafe;
207 
208 
210 
213 
216 
219 
222 
223  unique_ptr<UDPSocket> socket;
224 
226 };
227 
Base exception class for network client exceptions.
void cleanUpSafeMessages()
Clean up safe messages.
Definition: UDPClient.cpp:498
static const int MESSAGEACK_RESENDTIMES_TRIES
Definition: UDPClient.h:184
virtual void run()
Run thread program.
Definition: UDPClient.cpp:91
unordered_map< uint32_t, Message * > MessageMapAck
Definition: UDPClient.h:197
static uint64_t getRetryTime(const uint8_t retries)
Get retry time for given retry count.
Definition: UDPClient.h:55
void processAckReceived(const uint32_t messageId)
Processes ack reveived.
Definition: UDPClient.cpp:366
queue< UDPClientMessage * > RecvMessageQueue
Definition: UDPClient.h:198
static const uint64_t MESSAGEACK_KEEPTIME
Definition: UDPClient.h:187
void processAckMessages()
Process ack messages.
Definition: UDPClient.cpp:390
queue< Message * > MessageQueue
Definition: UDPClient.h:196
void setClientKey(const string &clientKey)
Set client key.
Definition: UDPClient.h:115
static const uint64_t MESSAGESSAFE_KEEPTIME
Definition: UDPClient.h:200
const UDPClient_Statistics getStatistics()
Definition: UDPClient.cpp:540
static const int MESSAGEQUEUE_SEND_BATCH_SIZE
Definition: UDPClient.h:186
unique_ptr< UDPSocket > socket
Definition: UDPClient.h:223
unordered_map< uint32_t, SafeMessage * > MessageMapSafe
Definition: UDPClient.h:206
void sendMessage(UDPClientMessage *clientMessage, bool safe)
Pushes a message to be send, takes over ownership of message.
Definition: UDPClient.cpp:309
const unsigned int getPort()
Definition: UDPClient.h:100
UDPClientMessage * createMessage(const UDPPacket *packet)
Create message.
Definition: UDPClient.cpp:530
STATIC_DLL_IMPEXT static const uint64_t MESSAGEACK_RESENDTIMES[MESSAGEACK_RESENDTIMES_TRIES]
Definition: UDPClient.h:185
bool processSafeMessage(UDPClientMessage *clientMessage)
Returns if a message should be processed or already have been processed.
Definition: UDPClient.cpp:454
UDPClient(const string &ip, const uint16_t port)
Public constructor.
Definition: UDPClient.cpp:49
UDPClientMessage * receiveMessage()
Receive message.
Definition: UDPClient.cpp:519
UDPClient_Statistics statistics
Definition: UDPClient.h:225
Interface to kernel event mechanismns.
Class representing a UDP socket.
Definition: UDPSocket.h:27
Mutex implementation.
Definition: Mutex.h:19
Base class for threads.
Definition: Thread.h:20
#define STATIC_DLL_IMPEXT
Definition: tdme.h:15
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6