CMSDK  2.0.1
NetworkConnections.h
1 #if !defined(_NETWORKCONNECTIONS_H_)
2 #define _NETWORKCONNECTIONS_H_
3 
4 #pragma once
5 
6 // #define UDPCON_PRINT_DEBUG
7 // #define UDPCON_PRINTBINARY_DEBUG
8 // #define TCPCON_PRINT_DEBUG
9 // #define TCPCON_PRINTBINARY_DEBUG
10 
11 #include "ThreadManager.h"
12 #include "HTML.h"
13 //#include "PsyTime.h"
14 
15 #ifdef _USE_SSL_
16  #include "openssl/bio.h"
17  #include <openssl/ssl.h>
18  #include <openssl/err.h>
19 #endif // _USE_SSL_
20 
21 namespace cmlabs{
22 
23 #define NOENC 1
24 #define SSLENC 2
25 #define AESENC 3
26 
27 #define TCPCON 1
28 #define UDPCON 2
29 #define SSLCON 3
30 #define AESCON 4
31 
32 #define INITIALBUFFERSIZE 4096
33 
34 #define NETWORKERROR_ACCEPT 1
35 #define NETWORKERROR_RECEIVE 2
36 #define NETWORKERROR_SEND_ERROR 3
37 #define NETWORKERROR_SEND_TIMEOUT 4
38 #define NETWORKERROR_MEMORYFULL 5
39 #define NETWORKERROR_GREETING_ERROR 6
40 
41 class TCPListener;
42 class TCPConnection;
43 class UDPConnection;
44 class NetworkConnection;
45 
47 public:
49  virtual bool receiveNetworkConnection(NetworkConnection* con) = 0;
50  virtual bool registerError(uint16 error, TCPListener* con) = 0;
51 };
52 
54 public:
56  virtual bool receiveData(char* data, uint32 size, NetworkConnection* con) = 0;
57  virtual bool registerError(uint16 error, NetworkConnection* con) = 0;
58 };
59 
60 
61 
62 
63 
64 
65 
66 class TCPListener : public Runnable {
67 public:
68  friend THREAD_RET THREAD_FUNCTION_CALL TCPListenerRun(THREAD_ARG arg);
69 
70  TCPListener();
71  virtual ~TCPListener();
72  bool setSSLCertificate(const char* sslCertPath, const char* sslKeyPath);
73  bool init(uint16 port, uint8 encryption, NetworkConnectionReceiver* receiver = NULL, NetworkDataReceiver* dataReceiver = NULL);
74  bool disconnect(uint16 error = 0);
75  bool isConnected();
76  uint64 getLocalAddress();
77 
78  NetworkConnection* acceptConnection(uint32 timeout);
79 
80 private:
81  uint8 encryption;
82  uint64 localAddress;
83  uint64 lastActivity;
84  SOCKET socket;
85  NetworkConnectionReceiver* receiver;
86  NetworkDataReceiver* dataReceiver;
87  utils::Mutex mutex;
88 
89  std::string sslCertPath;
90  std::string sslKeyPath;
91 
92  bool run();
93 };
94 
95 class NetworkConnection : public Runnable {
96 public:
99  virtual bool disconnect(uint16 error = 0);
100  virtual bool reconnect() = 0;
101  virtual bool didConnect(int timeout = 0);
102  virtual bool isConnected(int timeout = 0);
103  virtual bool isRemote();
104  virtual uint64 getRemoteAddress();
105  bool setConnectTimeout(uint32 timeoutMS);
106 
107  virtual bool send(char* data, uint32 size, uint64 receiver = 0) = 0;
108 // virtual int32 peekStream();
109  virtual bool receive(char* data, uint32 size, uint32 timeout, bool peek = false);
110  virtual bool receiveAvailable(char* data, uint32& size, uint32 maxSize, uint32 timeout, bool peek = false);
111  virtual bool discard(uint32 size);
112  virtual uint32 clearBuffer();
113 
114  virtual bool waitForDataToRead(uint32 timeout);
115  virtual bool waitForDataToBeWritten(uint32 timeout);
116 
117  virtual uint32 getOutputSpeed();
118  virtual uint32 getInputSpeed();
119 
120  virtual uint8 getConnectionType();
121 
122  bool setGreetingData(const char* data, uint32 size);
123  char* greetingData;
124  uint32 greetingSize;
125 
126 protected:
127  uint8 type;
128  uint64 remoteAddress;
129  uint64 localAddress;
130  uint64 lastActivity;
131  uint32 threadID;
132  SOCKET socket;
133  bool remote;
134  uint32 bufferLen;
135  uint32 bufferContentLen;
136  uint32 bufferContentPos;
137  NetworkDataReceiver* receiver;
138  utils::Mutex mutex;
139  utils::Mutex sendMutex;
140  char* buffer;
141  uint32 connectTimeoutMS;
142  uint32 inputSpeed;
143  uint32 outputSpeed;
144  uint64 inputBytes;
145  uint64 outputBytes;
146 
147  virtual int32 readIntoBuffer();
148  virtual bool resizeBuffer(uint32 len);
149  virtual bool run();
150 };
151 
152 
154 public:
155  friend THREAD_RET THREAD_FUNCTION_CALL UDPConnectionRun(THREAD_ARG arg);
156 
157  UDPConnection();
158  ~UDPConnection();
159  bool initForOutputOnly();
160  bool connect(uint16 port, NetworkDataReceiver* receiver = NULL);
161  bool send(char* data, uint32 size, uint64 receiver = 0);
162  bool reconnect();
163  bool setDefaultReceiver(uint64 receiver);
164  uint64 getLocalAddress();
165 
166 protected:
167  uint64 defaultReceiver;
168 };
169 
170 
172 public:
173  friend THREAD_RET THREAD_FUNCTION_CALL TCPConnectionRun(THREAD_ARG arg);
174 
175  TCPConnection();
176  ~TCPConnection();
177  bool connect(SOCKET s, uint64 localAddr, NetworkDataReceiver* receiver = NULL);
178  bool connect(uint64 addr, uint32 timeoutMS, NetworkDataReceiver* receiver = NULL);
179  bool connect(const char* addr, uint16 port, uint64& location, uint32 timeoutMS, NetworkDataReceiver* receiver = NULL);
180  bool connect(const uint32* addresses, uint16 addressCount, uint16 port, uint64& location, uint32 timeoutMS, NetworkDataReceiver* receiver = NULL);
181  bool delayedConnect(uint64 addr, uint32 timeoutMS, NetworkDataReceiver* receiver);
182  bool delayedConnect(const char* addr, uint16 port, uint64& location, uint32 timeoutMS, NetworkDataReceiver* receiver);
183  bool send(char* data, uint32 size, uint64 receiver = 0);
184  bool reconnect();
185 
186 protected:
187  bool findRemoteAddress(uint64& addr);
188 };
189 
190 THREAD_RET THREAD_FUNCTION_CALL SSLConnectionRun(THREAD_ARG arg);
191 
193 public:
194  friend THREAD_RET THREAD_FUNCTION_CALL SSLConnectionRun(THREAD_ARG arg);
195 
196  SSLConnection();
197  ~SSLConnection();
198  bool init();
199  bool init(const char *certFile, const char *keyFile);
200  bool connect(SOCKET s, uint64 localAddr, NetworkDataReceiver* receiver = NULL);
201  bool connect(uint64 addr, uint32 timeoutMS, NetworkDataReceiver* receiver = NULL);
202  bool connect(const char* addr, uint16 port, uint64& location, uint32 timeoutMS, NetworkDataReceiver* receiver = NULL);
203  bool connect(const uint32* addresses, uint16 addressCount, uint16 port, uint64& location, uint32 timeoutMS, NetworkDataReceiver* receiver = NULL);
204  bool delayedConnect(uint64 addr, uint32 timeoutMS, NetworkDataReceiver* receiver);
205  bool delayedConnect(const char* addr, uint16 port, uint64& location, uint32 timeoutMS, NetworkDataReceiver* receiver);
206  bool send(char* data, uint32 size, uint64 receiver = 0);
207  bool reconnect();
208  bool isConnected(int timeout = 0);
209  bool didConnect(int timeout = 0);
210  bool disconnect(uint16 error = 0);
211 
212  int32 peekStream();
213  int32 readIntoBuffer();
214  bool receive(char* data, uint32 size, uint32 timeout, bool peek = false);
215  bool receiveAvailable(char* data, uint32& size, uint32 maxSize, uint32 timeout, bool peek = false);
216 
217  std::string certinfo;
218 
219 protected:
220  bool findRemoteAddress(uint64& addr);
221  #ifdef _USE_SSL_
222  SSL_CTX *ctx;
223  SSL *ssl;
224  BIO *certbio;
225  BIO *outbio;
226 #endif //_USE_SSL_
227 };
228 
229 THREAD_RET THREAD_FUNCTION_CALL TCPListenerRun(THREAD_ARG arg);
230 THREAD_RET THREAD_FUNCTION_CALL TCPConnectionRun(THREAD_ARG arg);
231 THREAD_RET THREAD_FUNCTION_CALL UDPConnectionRun(THREAD_ARG arg);
232 
233 bool NetworkTest_TCPServer(uint16 port, uint32 count = 0);
234 bool NetworkTest_TCPClient(const char* address, uint16 port, uint32 count = 0);
235 bool NetworkTest_SendReceiveData(TCPConnection* con, char* data, uint32 dataLen, uint32 c, bool receiveFirst = false);
236 
237 }
238 
239 #endif // _NETWORKCONNECTIONS_H_
Definition: NetworkConnections.h:171
Definition: Bitmap.h:7
Definition: NetworkConnections.h:53
Definition: NetworkConnections.h:66
Definition: ThreadManager.h:33
Definition: NetworkConnections.h:153
Definition: NetworkConnections.h:95
Definition: NetworkConnections.h:192
Definition: NetworkConnections.h:46
Definition: Utils.h:276