ServerStage.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/03/20
  3. file base: ServerStage
  4. file ext: h
  5. author: liupeng
  6. purpose:
  7. *********************************************************************/
  8. #ifndef __INCLUDE_SERVERSTAGE_H__
  9. #define __INCLUDE_SERVERSTAGE_H__
  10. #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  11. #pragma once
  12. #endif
  13. #ifndef _WINDOWS_
  14. #define WIN32_LEAN_AND_MEAN
  15. #include <windows.h>
  16. #undef WIN32_LEAN_AND_MEAN
  17. #endif
  18. /*
  19.  * for disable some STL warning
  20.  */
  21. #pragma warning(disable:4786)
  22. #include "stack"
  23. #include "list"
  24. using namespace std;
  25. #if _MSC_VER > 1020 // if VC++ version is > 4.2
  26. using namespace std; // std c++ libs implemented in std
  27. #endif
  28. #include "InterfaceHeavenInterface.h"
  29. #include "InterfaceIServer.h"
  30. #include "IOCPServerSocketServer.h"
  31. #include "IOCPServerCriticalSection.h"
  32. #include "IOCPServertstring.h"
  33. /*
  34.  * Classes defined in other files...
  35.  */
  36. namespace OnlineGameLib {
  37. namespace Win32 {
  38. class CIOCompletionPort;
  39. class CIOBuffer;
  40. } // End of namespace OnlineGameLib
  41. } // End of namespace Win32
  42. typedef stack< int > std_STACK;
  43. typedef list< int > std_LIST;
  44. #define MAX_CLIENT_CANBELINKED 200
  45. #define MAX_SOCKET_KEEPINPOOL MAX_CLIENT_CANBELINKED
  46. #define MAX_BUFFER_KEEPINPOOL 500
  47. #define BUFFER_SIZE 1024 * 64
  48. #define EXTEND_BUFFER_SIZE BUFFER_SIZE
  49. /*
  50. Antetype: QueryServerInterface
  51. Return: S_OK : success create object
  52. E_OUTOFMEMORY : create faild
  53. Purpose: Get server interface
  54. CoInitialize( NULL ); 
  55. ...
  56. QueryServerInterface( ... );
  57. ...
  58. CoUninitialize();
  59. Created: 2003/03/19
  60. */
  61. STDAPI QueryServerInterface
  62. (
  63. REFIID riid,
  64. void **ppv
  65. );
  66. /*
  67.  * class CGameServerWorkerThread 
  68.  */
  69. class CGameServerWorkerThread : 
  70. public OnlineGameLib::Win32::CSocketServer::WorkerThread
  71. {
  72. public:
  73. friend class CClientManager;
  74. explicit CGameServerWorkerThread( 
  75. OnlineGameLib::Win32::CIOCompletionPort &iocp,
  76. CClientManager &refClientManager);
  77. virtual ~CGameServerWorkerThread();
  78. private:
  79. virtual void ReadCompleted(
  80. OnlineGameLib::Win32::CSocketServer::Socket *pSocket,
  81. OnlineGameLib::Win32::CIOBuffer *pBuffer);
  82. virtual void OnBeginProcessing();
  83. virtual void OnEndProcessing();
  84. virtual void OnError( const OnlineGameLib::Win32::_tstring &message );
  85. CClientManager &m_refClientManager;
  86. /*
  87.  * No copies do not implement
  88.  */
  89. CGameServerWorkerThread( const CGameServerWorkerThread &rhs );
  90. CGameServerWorkerThread &operator=( const CGameServerWorkerThread &rhs ); 
  91. };
  92. /*
  93.  * class CGameServer
  94.  */
  95. class CGameServer : public OnlineGameLib::Win32::CSocketServer
  96. {
  97. public:
  98. friend class CClientManager;
  99. CGameServer(
  100. CClientManager &refClientManager,
  101. unsigned long addressToListenOn,
  102. unsigned short portToListenOn,
  103. size_t maxFreeSockets,
  104. size_t maxFreeBuffers,
  105. size_t bufferSize = 1024,
  106. size_t numThreads = 0);
  107. CGameServer(
  108. CClientManager &refClientManager,
  109. size_t maxFreeSockets,
  110. size_t maxFreeBuffers,
  111. size_t bufferSize = 1024,
  112. size_t numThreads = 0);
  113. virtual ~CGameServer();
  114. private:
  115. virtual WorkerThread *CreateWorkerThread(
  116. OnlineGameLib::Win32::CIOCompletionPort &iocp);
  117. virtual SOCKET CreateListeningSocket(
  118. unsigned long address,
  119. unsigned short port);
  120. virtual void OnStartAcceptingConnections();
  121. virtual void OnStopAcceptingConnections();
  122. virtual void OnShutdownInitiated();
  123. virtual void OnShutdownComplete();
  124. virtual void OnConnectionCreated();
  125. virtual void OnConnectionEstablished(
  126. OnlineGameLib::Win32::CSocketServer::Socket *pSocket,
  127. OnlineGameLib::Win32::CIOBuffer *pAddress);
  128. virtual void OnConnectionClosed( 
  129. OnlineGameLib::Win32::CSocketServer::Socket *pSocket );
  130. virtual void OnConnectionDestroyed();
  131. virtual void OnError( const OnlineGameLib::Win32::_tstring &message );
  132. virtual void PreWrite( 
  133. OnlineGameLib::Win32::CSocketServer::Socket *pSocket, 
  134. OnlineGameLib::Win32::CIOBuffer *pBuffer, 
  135. const char *pData, 
  136. size_t dataLength );
  137. CClientManager &m_refClientManager;
  138. // No copies do not implement
  139. CGameServer( const CGameServer &rhs );
  140. CGameServer &operator=( const CGameServer &rhs );
  141. };
  142. /*
  143.  * struct tagClientContext
  144.  */
  145. typedef struct tagClientContext
  146. {
  147. /*
  148.  * Socket
  149.  */
  150. OnlineGameLib::Win32::CSocketServer::Socket *pSocket;
  151. /*
  152.  * Read
  153.  */
  154. OnlineGameLib::Win32::CCriticalSection csReadAction;
  155. OnlineGameLib::Win32::CIOBuffer *pRecvBuffer;
  156. OnlineGameLib::Win32::CIOBuffer *pReadBuffer;
  157. /*
  158.  * Write
  159.  */
  160. OnlineGameLib::Win32::CCriticalSection csWriteAction;
  161. OnlineGameLib::Win32::CIOBuffer *pWriteBuffer;
  162. }CLIENT_CONTEXT, NEAR *PCLIENT_CONTEXT, FAR *LPCLIENT_CONTEXT;
  163. /*
  164.  * class CClientManager
  165.  */
  166. class CClientManager : public IServer, private OnlineGameLib::Win32::CIOBuffer::Allocator
  167. {
  168. public:
  169. /*
  170.  * Inherit and public the IServer interface
  171.  */
  172. STDMETHOD( Startup )( );
  173. STDMETHOD( Cleanup )( );
  174. STDMETHOD( OpenService )(
  175. const unsigned long &ulnAddressToListenOn,
  176. const unsigned short &usnPortToListenOn );
  177. STDMETHOD( CloseService )();
  178. STDMETHOD( RegisterMsgFilter )( CALLBACK_SERVER_EVENT pfnEventNotify );
  179. STDMETHOD( PreparePackSink )( );
  180. STDMETHOD( PackDataToClient )
  181. (
  182. const unsigned long &ulnClientID,
  183. const void * const pData,
  184. const size_t &datalength );
  185. STDMETHOD( SendPackToClient )( );
  186. STDMETHOD_( const void *, GetPackFromClient )
  187. (
  188. const unsigned long &ulnClientID,
  189. size_t &datalength );
  190. STDMETHOD( ShutdownClient )( const unsigned long &ulnClientID );
  191. STDMETHOD_( size_t, GetClientCount )( );
  192. /*
  193.      *  IUnknown COM Interface Methods
  194.      */
  195.     STDMETHOD ( QueryInterface ) ( REFIID riid, void** ppv );
  196.     STDMETHOD_( ULONG, AddRef ) ( );
  197.     STDMETHOD_( ULONG, Release ) ( );
  198. public:
  199. CClientManager( size_t maxFreeBuffers, size_t bufferSize = 1024 );
  200. virtual ~CClientManager();
  201. unsigned long AddClient( OnlineGameLib::Win32::CSocketServer::Socket *pSocket );
  202. unsigned long DelClient( OnlineGameLib::Win32::CSocketServer::Socket *pSocket );
  203. void RecvFromClient(
  204. const unsigned long &ulnID,
  205. const char *pData, 
  206. size_t dataLength );
  207. protected:
  208. size_t GetMinimumMessageSize() const;
  209. size_t GetMessageSize( const OnlineGameLib::Win32::CIOBuffer *pBuffer ) const;
  210. OnlineGameLib::Win32::CIOBuffer *ProcessDataStream(
  211. const unsigned long &ulnID,
  212. OnlineGameLib::Win32::CIOBuffer *pBuffer) const;
  213. void ProcessCommand(
  214. const unsigned long &ulnID,
  215. const OnlineGameLib::Win32::CIOBuffer *pBuffer) const;
  216. private:
  217. LONG m_lRefCount;
  218. OnlineGameLib::Win32::CCriticalSection m_csSystemAction;
  219. CLIENT_CONTEXT m_clientContext[MAX_CLIENT_CANBELINKED];
  220. std_STACK m_freeClientStack;
  221. std_LIST m_usedClientStack;
  222. friend class CGameServer;
  223. CGameServer m_theGameServer;
  224. CALLBACK_SERVER_EVENT m_pfnCallBackServerEvent;
  225. };
  226. #endif // __INCLUDE_SERVERSTAGE_H__