5#include <unordered_map>
10#include <sys/socket.h>
21#ifndef WINDOWS_STYLE_DEFINITION
22#define WINDOWS_STYLE_DEFINITION
24#define closesocket close
26#define INVALID_SOCKET -1
27#define SOCKET_ERROR -1
41 std::unordered_map<std::string, std::vector<SOCKET>> data;
42 mutable std::mutex dataMutex;
45 ClientData() =
default;
47 void add(
const std::string&
ip, SOCKET socket);
49 void remove(
const std::string&
ip, SOCKET socket);
51 std::vector<SOCKET> extract(
const std::string&
ip);
55 std::vector<std::pair<std::string, std::vector<SOCKET>>> getClients()
const;
57 size_t getNumberOfClients()
const;
59 size_t getNumberOfConnections()
const;
61 ~ClientData() =
default;
91 virtual void receiveConnections(
const std::function<
void()>& onStartServer, std::exception** outException);
93 virtual void serve(std::string
ip, SOCKET clientSocket, sockaddr address);
102 virtual void clientConnection(
const std::string&
ip, SOCKET clientSocket, sockaddr address, std::function<
void()>& cleanup) = 0;
115 template<
typename DataT>
116 static int sendBytes(SOCKET clientSocket,
const DataT*
const data,
int size);
118 template<
typename DataT>
169 virtual void start(
bool wait =
false,
const std::function<
void()>& onStartServer = []() {}, std::exception** outException =
nullptr);
175 virtual void stop(
bool wait =
true);
181 virtual void kick(
const std::string&
ip);
228 std::vector<std::pair<std::string, std::vector<SOCKET>>>
getClients()
const;
234 std::string_view
getIp()
const;
240 std::string_view
getPort()
const;
245 template<
typename DataT>
253 lastSend = send(clientSocket,
reinterpret_cast<const char*
>(
data) + totalSent, size - totalSent, NULL);
255 if (lastSend == SOCKET_ERROR)
264 totalSent += lastSend;
266 }
while (totalSent < size);
271 template<
typename DataT>
274 int lastReceive = recv(clientSocket,
reinterpret_cast<char*
>(
data), size, NULL);
276 if (lastReceive == SOCKET_ERROR)
#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