BaseTCPServer v1.16.1
Base class for TCP server
Loading...
Searching...
No Matches
BaseTCPServer.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <future>
5#include <unordered_map>
6#include <vector>
7
8#ifdef __LINUX__
9#include <sys/types.h>
10#include <sys/socket.h>
11#include <netdb.h>
12#include <unistd.h>
13#else
14#include <WinSock2.h>
15#include <WS2tcpip.h>
16#endif // __LINUX__
17
18#include "WebServerException.h"
19
20#ifdef __LINUX__
21#ifndef WINDOWS_STYLE_DEFINITION
22#define WINDOWS_STYLE_DEFINITION
23
24#define closesocket close
25#define SOCKET int
26#define INVALID_SOCKET -1
27#define SOCKET_ERROR -1
28#define DWORD uint32_t
29
30#endif // WINDOWS_STYLE_DEFINITION
31#endif // __LINUX__
32
33namespace web
34{
36 {
37 private:
38 class ClientData
39 {
40 private:
41 std::unordered_map<std::string, std::vector<SOCKET>> data;
42 mutable std::mutex dataMutex;
43
44 public:
45 ClientData() = default;
46
47 void add(const std::string& ip, SOCKET socket);
48
49 void remove(const std::string& ip, SOCKET socket);
50
51 std::vector<SOCKET> extract(const std::string& ip);
52
53 void clear();
54
55 std::vector<std::pair<std::string, std::vector<SOCKET>>> getClients() const;
56
57 size_t getNumberOfClients() const;
58
59 size_t getNumberOfConnections() const;
60
61 ~ClientData() = default;
62 };
63
64 public:
65 static constexpr size_t ipV4Size = 16;
66
67 protected:
68 ClientData data;
69 std::string ip;
70 std::string port;
72 DWORD timeout;
73 bool freeDLL;
75 const bool multiThreading;
76 std::future<void> handle;
77
82
87
88 protected:
89 void createListenSocket();
90
91 virtual void receiveConnections(const std::function<void()>& onStartServer, std::exception** outException);
92
93 virtual void serve(std::string ip, SOCKET clientSocket, sockaddr address);
94
102 virtual void clientConnection(const std::string& ip, SOCKET clientSocket, sockaddr address, std::function<void()>& cleanup) = 0;
103
104 virtual void onConnectionReceive(SOCKET clientSocket, sockaddr address);
105
106 virtual void onInvalidConnectionReceive();
107
112 virtual bool autoCloseSocket() const;
113
114 protected:
115 template<typename DataT>
116 static int sendBytes(SOCKET clientSocket, const DataT* const data, int size);
117
118 template<typename DataT>
119 static int receiveBytes(SOCKET clientSocket, DataT* const data, int size);
120
121 public:
127 static std::string getClientIpV4(sockaddr address);
128
133 std::string getServerIpV4() const;
134
140 static uint16_t getClientPortV4(sockaddr address);
141
146 uint16_t getServerPortV4() const;
147
152 static std::string getVersion();
153
154 public:
162 BaseTCPServer(std::string_view port, std::string_view ip = "0.0.0.0", DWORD timeout = 0, bool multiThreading = true, u_long listenSocketBlockingMode = 0, bool freeDLL = true);
163
169 virtual void start(bool wait = false, const std::function<void()>& onStartServer = []() {}, std::exception** outException = nullptr);
170
175 virtual void stop(bool wait = true);
176
181 virtual void kick(const std::string& ip);
182
186 virtual void kickAll();
187
192 bool isServerRunning() const;
193
198 bool isListenSocketInBlockingMode() const;
199
205
210 void setAcceptedSocketsBlockingMode(bool block);
211
216 size_t getNumberOfClients() const;
217
222 size_t getNumberOfConnections() const;
223
228 std::vector<std::pair<std::string, std::vector<SOCKET>>> getClients() const;
229
234 std::string_view getIp() const;
235
240 std::string_view getPort() const;
241
242 virtual ~BaseTCPServer();
243 };
244
245 template<typename DataT>
246 int BaseTCPServer::sendBytes(SOCKET clientSocket, const DataT* const data, int size)
247 {
248 int lastSend = 0;
249 int totalSent = 0;
250
251 do
252 {
253 lastSend = send(clientSocket, reinterpret_cast<const char*>(data) + totalSent, size - totalSent, NULL);
254
255 if (lastSend == SOCKET_ERROR)
256 {
258 }
259 else if (!lastSend)
260 {
261 return totalSent;
262 }
263
264 totalSent += lastSend;
265
266 } while (totalSent < size);
267
268 return totalSent;
269 }
270
271 template<typename DataT>
272 int BaseTCPServer::receiveBytes(SOCKET clientSocket, DataT* const data, int size)
273 {
274 int lastReceive = recv(clientSocket, reinterpret_cast<char*>(data), size, NULL);
275
276 if (lastReceive == SOCKET_ERROR)
277 {
279 }
280
281 return lastReceive;
282 }
283}
#define THROW_WEB_SERVER_EXCEPTION
Definition WebServerException.h:39
Definition BaseTCPServer.h:36
ClientData data
Definition BaseTCPServer.h:68
std::string_view getPort() const
Initial passed port.
Definition BaseTCPServer.cpp:493
std::string getServerIpV4() const
Get server IP address.
Definition BaseTCPServer.cpp:331
virtual void receiveConnections(const std::function< void()> &onStartServer, std::exception **outException)
Definition BaseTCPServer.cpp:180
bool isRunning
Definition BaseTCPServer.h:74
bool freeDLL
Definition BaseTCPServer.h:73
virtual void serve(std::string ip, SOCKET clientSocket, sockaddr address)
Definition BaseTCPServer.cpp:280
bool isListenSocketInBlockingMode() const
Is server's listen socket in blocking mode.
Definition BaseTCPServer.cpp:458
bool isAcceptedSocketsInBlockingMode() const
Is client's socket in blocking mode.
Definition BaseTCPServer.cpp:463
size_t getNumberOfClients() const
Number of IP addresses.
Definition BaseTCPServer.cpp:473
u_long listenSocketBlockingMode
0 for blocking, non 0 for non blocking
Definition BaseTCPServer.h:86
virtual void stop(bool wait=true)
Stop receiving new connections.
Definition BaseTCPServer.cpp:418
static constexpr size_t ipV4Size
Definition BaseTCPServer.h:65
BaseTCPServer(std::string_view port, std::string_view ip="0.0.0.0", DWORD timeout=0, bool multiThreading=true, u_long listenSocketBlockingMode=0, bool freeDLL=true)
Definition BaseTCPServer.cpp:383
virtual void onConnectionReceive(SOCKET clientSocket, sockaddr address)
Definition BaseTCPServer.cpp:302
u_long blockingMode
0 for blocking, non 0 for non blocking
Definition BaseTCPServer.h:81
std::string ip
Definition BaseTCPServer.h:69
static std::string getClientIpV4(sockaddr address)
Get client IP address.
Definition BaseTCPServer.cpp:317
virtual void start(bool wait=false, const std::function< void()> &onStartServer=[]() {}, std::exception **outException=nullptr)
Start server in separate thread.
Definition BaseTCPServer.cpp:404
std::future< void > handle
Definition BaseTCPServer.h:76
std::string_view getIp() const
Initial passed IP.
Definition BaseTCPServer.cpp:488
DWORD timeout
Definition BaseTCPServer.h:72
bool isServerRunning() const
Is server accept new connections.
Definition BaseTCPServer.cpp:453
std::string port
Definition BaseTCPServer.h:70
virtual void kick(const std::string &ip)
Kick specific client.
Definition BaseTCPServer.cpp:430
SOCKET listenSocket
Definition BaseTCPServer.h:71
static uint16_t getClientPortV4(sockaddr address)
Get client port.
Definition BaseTCPServer.cpp:356
std::vector< std::pair< std::string, std::vector< SOCKET > > > getClients() const
Get all clients ip - sockets.
Definition BaseTCPServer.cpp:483
virtual ~BaseTCPServer()
Definition BaseTCPServer.cpp:498
uint16_t getServerPortV4() const
Get server port.
Definition BaseTCPServer.cpp:361
static int receiveBytes(SOCKET clientSocket, DataT *const data, int size)
Definition BaseTCPServer.h:272
virtual void onInvalidConnectionReceive()
Definition BaseTCPServer.cpp:307
void createListenSocket()
Definition BaseTCPServer.cpp:93
virtual bool autoCloseSocket() const
Automatically close socket after clientConnection in cleanup function.
Definition BaseTCPServer.cpp:312
virtual void kickAll()
Kick all clients.
Definition BaseTCPServer.cpp:440
const bool multiThreading
Definition BaseTCPServer.h:75
static std::string getVersion()
Get BaseTCPServer version.
Definition BaseTCPServer.cpp:376
static int sendBytes(SOCKET clientSocket, const DataT *const data, int size)
Definition BaseTCPServer.h:246
void setAcceptedSocketsBlockingMode(bool block)
Set blocking mode for all connected sockets.
Definition BaseTCPServer.cpp:468
size_t getNumberOfConnections() const
Number of sockets(each IP address may have few sockets)
Definition BaseTCPServer.cpp:478
virtual void clientConnection(const std::string &ip, SOCKET clientSocket, sockaddr address, std::function< void()> &cleanup)=0
Serving each client connection.
Definition BaseTCPServer.cpp:17