5 #if UTL_HOST_OS == UTL_OS_MINGW 9 #include <libutl/win32api.h> 10 #include <libutl/Array.h> 11 #include <libutl/FDstream.h> 12 #include <libutl/Hashtable.h> 13 #include <libutl/List.h> 14 #include <libutl/Mutex.h> 15 #include <libutl/RingBuffer.h> 16 #include <libutl/Semaphore.h> 17 #include <libutl/TCPserverSocket.h> 18 #include <libutl/Thread.h> 26 class NetServerClient;
41 class NetServer :
public Thread
43 friend class NetServerClient;
53 NetServer(
size_t maxClients,
size_t maxPaused = 1,
size_t clientsPerThread = 1)
55 init(maxClients, maxPaused, clientsPerThread);
58 virtual void* run(
void* arg =
nullptr);
64 bool addServer(TCPserverSocket* serverSocket);
72 void clientDisconnectAll();
78 void clientDisconnect(NetServerClient* client);
86 virtual NetServerClient* clientMake(FDstream* socket,
const InetHostAddress& addr);
89 NetServerClient* clientFind(
int fd)
const;
96 virtual void clientWriteServerBusyMsg(Stream& os) = 0;
102 virtual void onClientConnect(NetServerClient* client) = 0;
108 virtual void onClientDisconnect(NetServerClient* client) = 0;
111 virtual bool exiting()
const;
114 void init(
size_t maxClients =
size_t_max,
size_t maxPaused = 1,
size_t clientsPerThread = 1);
117 bool clientDeactivate(NetServerClient* client);
123 virtual void clientReadMsg(NetServerClient* client) = 0;
125 TCPserverSocket* serverFind(
int fd);
127 void cleanupJoinable();
129 void cleanupPaused();
131 void clientsAdd(NetServerClient* client);
133 bool pausedAdd(NetServerClient* client);
135 NetServerClient* pausedFind();
138 using client_ptr_t = std::atomic<NetServerClient*>;
141 Array _serverSockets;
144 size_t _clientsPerThread;
150 client_ptr_t* _clients;
153 char pad0[UTL_CACHE_LINE_SIZE -
sizeof(size_t)];
154 std::atomic_size_t _clientsCount;
155 char pad1[UTL_CACHE_LINE_SIZE -
sizeof(size_t)];
156 std::atomic_size_t _clientsIndex;
178 class NetServerClient :
public Thread
180 friend class NetServer;
186 NetServerClient(NetServer* server, FDstream* socket,
const InetHostAddress& addr);
188 virtual const Object& getKey()
const;
192 virtual void* run(
void* arg =
nullptr);
194 virtual void pause();
196 virtual void resume(FDstream* socket,
const InetHostAddress& addr);
204 void setSocket(Stream* stream);
213 Stream& unbufferedSocket()
const;
215 const InetHostAddress&
222 setAddr(
const InetHostAddress& addr)
234 setVerified(
bool verified)
236 _verified = verified;
252 setIndex(
size_t index)
258 setNumClients(
size_t numClients)
260 _numClients = numClients;
266 return (_numClients > 0) && (_socket ==
nullptr);
272 return (_numClients == 0);
290 InetHostAddress _addr;
301 #endif // UTL_HOST_OS == UTL_OS_MINGW void deInit()
De-initialize UTL++.
Counter for resources shared between threads.
#define UTL_CLASS_DECL(DC, BC)
Declaration of standard UTL++ functionality for a non-template class.
const size_t size_t_max
Maximum size_t value.
Thread-safe fixed-size queue.
#define UTL_CLASS_DECL_ABC(DC, BC)
Declaration of standard UTL++ functionality for an abstract base class (ABC).
#define ABORT()
Immediately terminates the program.
#define UTL_CLASS_NO_SERIALIZE
Declare that a class cannot do serialize().
#define UTL_CLASS_NO_COPY
Declare that a class cannot do copy().
void init()
Initialize UTL++.
#define ASSERTD
Do an assertion in DEBUG mode only.