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

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/04/15
  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. #pragma warning(disable : 4786)  // identifier was truncated to '255' characters 
  11.                                  // in the debug information
  12. #include "SocketServer.h"
  13. #include "tstring.h"
  14. #include "Event.h"
  15. #include ".InterfaceIServer.h"
  16. #include <map>
  17. #include <stack>
  18. #include <list>
  19. #include <queue>
  20. /*
  21.  * class CIOCPServer
  22.  */
  23. class CIOCPServer : public IServer, public OnlineGameLib::Win32::CSocketServer
  24. {
  25. public:
  26. /*
  27.  * Inherit and public the IServer interface
  28.  */
  29. STDMETHOD( Startup )( );
  30. STDMETHOD( Cleanup )( );
  31. STDMETHOD( OpenService )( const unsigned long &ulnAddressToListenOn,
  32. const unsigned short &usnPortToListenOn );
  33. STDMETHOD( CloseService )();
  34. STDMETHOD( RegisterMsgFilter )( LPVOID lpParam, 
  35. CALLBACK_SERVER_EVENT pfnEventNotify );
  36. STDMETHOD( RegisterMsgFilter )( const unsigned long ulnClientID, 
  37. IMessageProcess* pfnMsgNotify );
  38. STDMETHOD( PreparePackSink )( );
  39. STDMETHOD( PackDataToClient )( const unsigned long &ulnClientID,
  40. const void * const pData,
  41. const size_t &datalength );
  42. STDMETHOD( SendPackToClient )( const unsigned long &ulnClientID /* -1 */ );
  43. STDMETHOD( SendData )( const unsigned long &ulnClientID,
  44. const void * const pData,
  45. const size_t &datalength );
  46. STDMETHOD_( const void *, GetPackFromClient )( 
  47. const unsigned long &ulnClientID,
  48. size_t &datalength );
  49. STDMETHOD( ShutdownClient )( const unsigned long &ulnClientID );
  50. STDMETHOD_( size_t, GetClientCount )( );
  51. STDMETHOD_( const char *, GetClientInfo )( const unsigned long &ulnClientID );
  52. /*
  53.      *  IUnknown COM Interface Methods
  54.      */
  55.     STDMETHOD ( QueryInterface ) ( REFIID riid, void** ppv );
  56.     STDMETHOD_( ULONG, AddRef ) ( );
  57.     STDMETHOD_( ULONG, Release ) ( );
  58. public:
  59. CIOCPServer(
  60. size_t nPlayerMaxCount,
  61. size_t nPrecision,
  62. size_t maxFreeSockets,
  63. size_t maxFreeBuffers,
  64. size_t maxFreeBuffers_Cache,
  65. size_t bufferSize_Cache = 8192,
  66. size_t bufferSize = 1024,
  67. size_t numThreads = 0 );
  68. virtual ~CIOCPServer();
  69. protected:
  70. virtual void OnConnectionEstablished( Socket *pSocket,
  71.          OnlineGameLib::Win32::CIOBuffer *pAddress );
  72. virtual bool OnConnectionClosing( Socket *pSocket );
  73. virtual void OnConnectionClosed( Socket *pSocket );
  74. virtual void ReadCompleted( Socket *pSocket,
  75. OnlineGameLib::Win32::CIOBuffer *pBuffer );
  76. protected:
  77. size_t GetMinimumMessageSize();
  78. size_t GetMessageSize( const OnlineGameLib::Win32::CIOBuffer *pBuffer );
  79. OnlineGameLib::Win32::CIOBuffer *ProcessDataStream( Socket *pSocket,
  80. OnlineGameLib::Win32::CIOBuffer *pBuffer);
  81. void ProcessMessage( Socket *pSocket,
  82. OnlineGameLib::Win32::CIOBuffer *pBuffer);
  83. void ProcessCommand( Socket *pSocket,
  84. const OnlineGameLib::Win32::CIOBuffer *pBuffer);
  85. private:
  86. LONG m_lRefCount;
  87. OnlineGameLib::Win32::CIOBuffer::Allocator m_theCacheAllocator;
  88. const size_t m_nPlayerMaxCount;
  89. const size_t m_nPrecision;
  90. const size_t m_nNetworkBufferMaxLen;
  91. LPVOID m_lpCallBackParam;
  92. CALLBACK_SERVER_EVENT m_pfnCallBackServerEvent;
  93. /*
  94.  * Client information
  95.  */
  96. typedef struct tagClientNode
  97. {
  98. OnlineGameLib::Win32::CSocketServer::Socket *pSocket;
  99. OnlineGameLib::Win32::CCriticalSection csReadAction;
  100. OnlineGameLib::Win32::CIOBuffer *pRecvBuffer;
  101. OnlineGameLib::Win32::CIOBuffer *pReadBuffer;
  102. OnlineGameLib::Win32::CCriticalSection csWriteAction;
  103. OnlineGameLib::Win32::CIOBuffer *pWriteBuffer;
  104.         unsigned    uKeyMode;
  105. unsigned uServerKey;
  106. unsigned uClientKey;
  107. }CLIENT_NODE, NEAR *PCLIENT_NODE, FAR *LPCLIENT_NODE;
  108. typedef std::map< size_t, LPCLIENT_NODE > CLIENT_MANAGER;
  109. OnlineGameLib::Win32::CCriticalSection m_csCM;
  110. CLIENT_MANAGER m_theClientManager;
  111. /*
  112.  * ATTENTION :
  113.  *
  114.  * Convert stack to queue, because of a specific usage in the S3Server
  115.  * But stack can decrease hit the target of memory cache in system
  116.  *
  117.  * Modify on 2002.5.14
  118.  */
  119. typedef std::queue< size_t > QUEUE;
  120. //typedef std::stack< size_t > STACK;
  121. typedef std::list< size_t > LIST;
  122. OnlineGameLib::Win32::CCriticalSection m_csFCN;
  123. //STACK m_freeClientNode;
  124. QUEUE m_freeClientNode;
  125. /*
  126.  * use m_csUCN same as m_csCM
  127.  */
  128. //OnlineGameLib::Win32::CCriticalSection m_csUCN;
  129. LIST m_usedClientNode;
  130. /*
  131.  * Helper
  132.  */
  133. class CTaskQueue
  134. {
  135. public:
  136. ~CTaskQueue();
  137. void Push( void *pItem );
  138. void *Pop();
  139. private:
  140. OnlineGameLib::Win32::CCriticalSection m_cs;
  141. typedef std::stack< void * > TASK_STACK;
  142. TASK_STACK m_theTaskStack;
  143. };
  144. bool _SendDataEx( LPCLIENT_NODE pNode,
  145. const void * const pData,
  146. const size_t &datalength );
  147. /*
  148.  * Helper for process user login & logout
  149.  */
  150. CTaskQueue m_theAddClientQueue;
  151. CTaskQueue m_theDelClientQueue;
  152. OnlineGameLib::Win32::CEvent m_hQuitHelper;
  153. HANDLE m_hHelperThread;
  154. static unsigned int __stdcall HelperThreadFunction( void *pParam );
  155. unsigned int _HelperThreadFunction();
  156. bool _HelperAddClient();
  157. bool _HelperDelClient();
  158. };
  159. /*
  160.  * class CServerFactory
  161.  */
  162. class CServerFactory : public IServerFactory
  163. {
  164. public:
  165. STDMETHOD( SetEnvironment )
  166. (
  167. const size_t &nPlayerMaxCount,
  168. const size_t &nPrecision,
  169. const size_t &maxFreeBuffers_Cache,
  170. const size_t &bufferSize_Cache
  171. );
  172. STDMETHOD( CreateServerInterface )
  173. (
  174. REFIID riid, 
  175. void** ppv
  176. );
  177. /*
  178.      *  IUnknown COM Interface Methods
  179.      */
  180.     STDMETHOD ( QueryInterface ) ( REFIID riid, void** ppv );
  181.     STDMETHOD_( ULONG, AddRef ) ( );
  182.     STDMETHOD_( ULONG, Release ) ( );
  183. public:
  184. CServerFactory();
  185. virtual ~CServerFactory();
  186. private:
  187. long m_lRefCount;
  188. size_t m_nPlayerMaxCount;
  189. size_t m_nPrecision;
  190. size_t m_maxFreeBuffers_Cache;
  191. size_t m_bufferSize_Cache;
  192. };
  193. #endif // __INCLUDE_SERVERSTAGE_H__