Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cNetServer.h
Go to the documentation of this file.
1 //
4 //
5 #ifndef _INC_cNetServer_H
6 #define _INC_cNetServer_H
7 #ifndef NO_PRAGMA_ONCE
8 #pragma once
9 #endif
10 
11 #include "cNetStream.h"
12 #include "cProtocol.h"
13 #include "../Thread/cThread.h"
14 #include "../Math/cValueStats.h"
16 
17 namespace GrayLib
18 {
20 
21  class cNetServer;
22  class cNetServerGroup;
23  class cNetSocketSet;
24 
26  {
31 
32  public:
36 
37  public:
39  cNetServerPort(const cNetAddress& rSockAddr);
40 
41  HASHCODE_t get_HashCode() const noexcept
42  {
43  return m_Socket.get_HashCode();
44  }
45 
46  HRESULT SetAddress(const cNetAddress& rSockAddr);
47  HRESULT CreateBindAndListen();
48  };
50 
51  class GRAYLIB_LINK cNetServerConnection : public cRefBase, public cNetStream, public IUnkObject
52  {
58 
59  typedef cNetStream SUPER_t;
60 
61  public:
64 
66  // cNetAddrTrackPtr m_pAddrTracker; //!< Track m_addrPeer across all sessions. Watch out for DoS attacks.
67 
69 
70  public:
71  cNetServerConnection(cNetServerGroup* pServerGroup, cNetServerPort* pListenPort, SOCKET hSocket, const cNetAddress& addrPeer, cProtocolStream* pProtocol = nullptr);
72  virtual ~cNetServerConnection();
73 
74  const char* get_ServerName() const;
75 
76  HASHCODE_t get_HashCode() const noexcept
77  {
79  return cNetStream::get_HashCode();
80  }
81  STDMETHOD_(HASHCODE_t, get_HashCodeX)() const noexcept override
82  {
84  return cNetStream::get_HashCode();
85  }
86  STDMETHOD_(cString, get_Name)() const override;
87  STDMETHOD_(cStringA, get_SymName)() const
88  {
89  return StrArg<char>(get_HashCode(), (RADIX_t)0x10);
90  }
91 
92  HRESULT ProcessStreamInp();
93 
94  // cNetStream
95  virtual HRESULT onEventRead() override;
96  virtual HRESULT OnTickStream();
97 #ifdef _WIN32
98  virtual void OnClose() override;
99 #endif
100  virtual void Close() override;
101 
103  };
105 
107  {
112 
113  public:
116 
117  protected:
119 
120  protected:
121  HRESULT OnClientWrite(cNetServerConnection* pClient);
122  virtual HRESULT OnClientRead(cNetServerConnection* pClient);
123  HRESULT OnTickSelect(TIMESYSD_t tWaitMax, cNetSocketSet& readfds, cNetSocketSet& writefds);
124  virtual void OnTickClients();
125 
126  public:
127  cNetServerGroup(cNetServer& server);
128  virtual ~cNetServerGroup();
129 
130  const char* get_ServerName() const;
131 
133  {
135  return m_aConnections.GetSize();
136  }
137 
138  bool RemoveClient(cNetServerConnection* pClient);
139  void MoveClientToGroup(cNetServerConnection* pClient);
140  void MoveClientToClose(cNetServerConnection* pClient);
141  };
142 
143  class GRAYLIB_LINK cNetServerThread : public cNetServerGroup, public cThreadNamed<cNetServerThread>
144  {
148  protected:
149  virtual bool ThreadTick() override;
150  public:
151  cNetServerThread(cNetServer& server);
152  UINT get_LoadScore() const;
153  };
155 
157  {
165 
166  typedef cProtocolFactories SUPER_t;
167  friend class cNetServerGroup;
168 
169  public:
170  const char* m_pszServerName;
171  const bool m_bAsyncEvents;
172 
176 
177  protected:
179 
184 
185  protected:
186  void OnClientCloseComplete();
187 
188  HRESULT TestProtocolClient(cNetServerConnection* pClient);
189  HRESULT OnEventAccept(cNetServerPort* pListenPort, LSTATUS wError);
190 
191  HRESULT OnClientConnect(cNetServerConnection* pClient);
192  virtual HRESULT OnClientReady(cNetServerConnection* pClient);
193  virtual void OnClientClose(cNetServerConnection* pClient);
194 
195  virtual HRESULT OnClientRead(cNetServerConnection* pClient) override;
196 
197  public:
198  cNetServer(const char* pszName = "NetServer", bool bAsyncEvents = false);
199  virtual ~cNetServer();
200 
201  const char* get_ServerName() const noexcept
202  {
203  return m_pszServerName;
204  }
205 
206  ITERATE_t get_ConnectionQty() const noexcept
207  {
209  return m_aListenPorts.GetSize() + m_aConnections.GetSize() + m_aConnecting.GetSize();
210  }
211 
212  HRESULT AddListenPort(cNetServerPort* pServerPort);
213  HRESULT AddListenPort(const cNetAddress& SockAddr);
214  HRESULT AddListenPort2(const cNetAddress& SockAddr, OUT cNetServerPortPtr* ppServerPort = nullptr);
215  bool RemoveListenPort(cNetServerPort* pServerPort);
216 
217  ITERATE_t get_ListenPortQty() const noexcept
218  {
220  return m_aListenPorts.GetSize();
221  }
223  {
224  ASSERT(m_aListenPorts.IsValidIndex(i));
225  return m_aListenPorts[i];
226  }
227 
228  HRESULT CreateServerStream(const cNetAddress& addr, IProtocolFactory& pf, cNetServerConnectionPtr& rpStream);
229  virtual HRESULT CheckAddressBeforeAccept(const cNetAddress& Addr) const;
230 
231 #ifdef _WIN32
232  bool OnEvent(SOCKET hSocket, WORD wEvent, LSTATUS wError); // called from HWND notifications. FD_READ FD_WRITE
233 #endif
234 
235  bool InitServer();
236  void CloseServer();
237 
238  virtual void OnTickClients() override;
239  void OnTickServer(TIMESYSD_t tWaitMax = 0);
240 
242  };
243 
244 }
245 #endif
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cNetAddr.h:31
Definition: cNetServer.h:52
const cNetAddress m_addrPeer
The peer (source/remote) connection address. if i care.
Definition: cNetServer.h:65
HASHCODE_t get_HashCode() const noexcept
Definition: cNetServer.h:76
cNetServerPortPtr m_pListenPort
the server port i connected on. (if incoming connection, nullptr if outgoing connection)(used to reso...
Definition: cNetServer.h:63
STDMETHOD_(HASHCODE_t, get_HashCodeX)() const noexcept override
Definition: cNetServer.h:81
cProtocolStreamPtr m_pProtocol
resolved to talk this protocol. nullptr = protocol not resolved yet.
Definition: cNetServer.h:68
STDMETHOD_(cString, get_Name)() const override
STDMETHOD_(cStringA, get_SymName)() const
Definition: cNetServer.h:87
cNetServerGroup * m_pServerGroup
Assigned to this group/thread for processing.
Definition: cNetServer.h:62
Definition: cNetServer.h:107
cNetServer & m_server
My top level cNetServer owner/parent.
Definition: cNetServer.h:114
cThreadLockArrayHash< cNetServerConnection > m_aConnections
Collection of active clients. sorted by socket id.
Definition: cNetServer.h:118
ITERATE_t get_ClientQty() const
Definition: cNetServer.h:132
cValueStatsRate< float > m_TickLatency
How long did the last OnTickSelect and OnTickClients take ? TIMESYS_t.
Definition: cNetServer.h:115
Definition: cNetServer.h:26
HASHCODE_t get_HashCode() const noexcept
Definition: cNetServer.h:41
cProtocolFactories m_Factories
What protocols does this port support/prefer ?
Definition: cNetServer.h:34
cNetSocket m_Socket
Open listen socket.
Definition: cNetServer.h:35
cNetAddress m_SockAddr
What local address am i bound to? (or should be bound to) may be all adapter/interfaces for the same ...
Definition: cNetServer.h:33
Definition: cNetServer.h:144
Definition: cNetServer.h:157
ITERATE_t get_ListenPortQty() const noexcept
Definition: cNetServer.h:217
cArrayRef< cNetServerThread > m_aThreads
Alternate threads used to process clients.
Definition: cNetServer.h:180
const char * m_pszServerName
Server type name. (not host name)
Definition: cNetServer.h:170
int m_nMaxConnections
total allowed incoming connections.
Definition: cNetServer.h:173
int m_nMaxPerAddr
max connections per host/address.
Definition: cNetServer.h:174
cArraySortHash< cNetServerConnection > m_aConnecting
My Outgoing connections. From this server to some place.
Definition: cNetServer.h:181
UNITTEST_FRIEND(cNetServer)
cNetServerPortPtr EnumListenPort(ITERATE_t i) const
Definition: cNetServer.h:222
cNetSystemPtr m_NetSystem
I use the network.
Definition: cNetServer.h:178
ITERATE_t get_ConnectionQty() const noexcept
Definition: cNetServer.h:206
cThreadLockArrayHash< cNetServerConnection > m_aClosing
Call OnClientClose these connections.
Definition: cNetServer.h:182
const char * get_ServerName() const noexcept
Definition: cNetServer.h:201
cArraySortHash< cNetServerPort > m_aListenPorts
The server SOCKET(s) we are currently listening on. 1 for each port.
Definition: cNetServer.h:183
int m_nMaxPerAddrUnresolved
max unresolved protocol connections per host/address.
Definition: cNetServer.h:175
const bool m_bAsyncEvents
_WIN32 only. use async callbacks.
Definition: cNetServer.h:171
Definition: cNetSocketSet.h:18
Definition: cNetSocket.h:185
HASHCODE_t get_HashCode() const noexcept
Definition: cNetSocket.h:345
Definition: cNetStream.h:20
HASHCODE_t get_HashCode() const noexcept
Definition: cNetStream.h:71
Definition: cProtocol.h:147
Definition: cProtocol.h:24
Definition: cThread.h:256
ITERATE_t GetSize() const noexcept
Definition: cArray.h:137
Definition: cArrayRef.h:21
bool IsValidIndex(ITERATE_t i) const noexcept
Definition: cArraySort.h:432
Definition: cArraySortRef.h:60
Definition: cRefPtr.h:22
Definition: cStream.h:66
Definition: cThreadArray.h:240
ITERATE_t GetSize() const
Definition: cThreadArray.h:263
Definition: cMesh.h:22
UNITTEST2_PREDEF(cQuadtree)
cRefPtr< cNetServerPort > cNetServerPortPtr
Definition: cNetServer.h:49
cRefPtr< cNetServerThread > cNetServerThreadPtr
Definition: cNetServer.h:154
cRefPtr< cNetServerConnection > cNetServerConnectionPtr
Definition: cNetServer.h:104
LONG LSTATUS
AKA error_status_t. FACILITY_WIN32 codes returned from RegCreateKeyEx() etc. Maybe NOT GetLastError()...
Definition: HResult.h:74
INT32 TIMESYSD_t
Time delta. signed milli-Seconds Span. cTimeSys::k_DMAX, cTimeSys::k_INF = MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:28
int ITERATE_t
like size_t but signed
Definition: Index.h:28
WORD RADIX_t
Base for convert of numbers to strings. e.g. 10 base vs 16 base hex numbers.
Definition: StrChar.h:27
UINT_PTR HASHCODE_t
could hold a pointer converted to a number? maybe 64 or 32 bit ? same as size_t.
Definition: GrayCore.h:116
const char *__stdcall StrArg< char >(const char *pszStr) noexcept
Definition: StrArg.h:63
Definition: cProtocol.h:125