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

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/02/24
  3. file base: JXServer
  4. file ext: h
  5. author: liupeng
  6. purpose:
  7. *********************************************************************/
  8. #ifndef __INCLUDE_JXSERVER_H__
  9. #define __INCLUDE_JXSERVER_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. #include "IOCPServerSocketServer.h"
  19. #include "IOCPServerCriticalSection.h"
  20. #include "stack"
  21. #include "list"
  22. using namespace std;
  23. #if _MSC_VER > 1020 // if VC++ version is > 4.2
  24. using namespace std; // std c++ libs implemented in std
  25. #endif
  26. typedef stack< unsigned long > STACK;
  27. typedef list< unsigned long > LIST;
  28. /*
  29.  * Macro define
  30.  */
  31. #define MAX_CLIENT_CANBELINKED 200
  32. #define MAX_SOCKET_KEEPINPOOL MAX_CLIENT_CANBELINKED
  33. #define MAX_BUFFER_KEEPINPOOL 1000
  34. #define BUFFER_SIZE 1024 * 64
  35. #define EXTEND_BUFFER_SIZE BUFFER_SIZE
  36. /*
  37.  * If you install this function, You can get some event that 
  38.  * it happend on all whole client. example: a connect come from client,
  39.  * a client close the current link, etc.
  40.  */
  41. #define CLIENT_CONNECT_CREATE 1
  42. #define CLIENT_CONNECT_CLOSE 2
  43. typedef VOID ( CALLBACK *CALLBACK_SERVER_EVENT )( 
  44. const unsigned long ulnID,
  45. DWORD dwEventType /*CLIENT_CONNECT_CREATE | CLIENT_CONNECT_CLOSE*/ );
  46. /*
  47.  * struct tagClientContext
  48.  */
  49. typedef struct tagClientContext
  50. {
  51. OnlineGameLib::Win32::CSocketServer::Socket *pSocket;
  52. OnlineGameLib::Win32::tagSockAddrIn SocketAddrIn;
  53. OnlineGameLib::Win32::CCriticalSection csReadAction;
  54. OnlineGameLib::Win32::CCriticalSection csWriteAction;
  55. OnlineGameLib::Win32::CIOBuffer *pRecvBuffer;
  56. OnlineGameLib::Win32::CIOBuffer *pReadBuffer;
  57. OnlineGameLib::Win32::CIOBuffer *pWriteBuffer;
  58. }CLIENT_CONTEXT, NEAR *PCLIENT_CONTEXT, FAR *LPCLIENT_CONTEXT;
  59. /*
  60.  * class CClientManager
  61.  */
  62. class CClientManager : private OnlineGameLib::Win32::CIOBuffer::Allocator
  63. {
  64. public:
  65. CClientManager( size_t maxFreeBuffers, size_t bufferSize = 1024);
  66. ~CClientManager();
  67. unsigned long AddClient( 
  68. OnlineGameLib::Win32::CSocketServer::Socket *pSocket,
  69. OnlineGameLib::Win32::CIOBuffer *pAddress );
  70. unsigned long DelClient( 
  71. OnlineGameLib::Win32::CSocketServer::Socket *pSocket );
  72. void SendToClient(
  73. const unsigned long ulnID, 
  74. const char *pData,
  75. size_t dataLength );
  76. const char *GetFromClient(
  77. const unsigned long ulnID,
  78. size_t &dataLength );
  79. void RecvFromClient(
  80. const unsigned long ulnID, 
  81. const char *pData,
  82. size_t dataLength );
  83. size_t GetClientCount();
  84. ULONG GetClientAddrIP( const unsigned long &ulnID );
  85. void ShutdownClient( const unsigned long ulnID );
  86. void PrepareToSend();
  87. void BeginToSend();
  88. void InstallCallBack( CALLBACK_SERVER_EVENT pfn ) { m_pfnCallBackServerEvent = pfn; };
  89. protected:
  90. size_t GetMinimumMessageSize() const;
  91. size_t GetMessageSize( const OnlineGameLib::Win32::CIOBuffer *pBuffer ) const;
  92. OnlineGameLib::Win32::CIOBuffer *ProcessDataStream(
  93. const unsigned long ulnID,
  94. OnlineGameLib::Win32::CIOBuffer *pBuffer) const;
  95. void ProcessCommand(
  96. const unsigned long ulnID,
  97. const OnlineGameLib::Win32::CIOBuffer *pBuffer) const;
  98. private:
  99. /*
  100.  * Private data
  101.  */
  102. OnlineGameLib::Win32::CCriticalSection m_csAction;
  103. OnlineGameLib::Win32::CCriticalSection m_csWriteExchange;
  104. CLIENT_CONTEXT m_clientContext[MAX_CLIENT_CANBELINKED];
  105. STACK m_freeClientStack;
  106. LIST m_usedClientStack;
  107. CALLBACK_SERVER_EVENT m_pfnCallBackServerEvent;
  108. };
  109. /*
  110.  * Public interface for the third user
  111.  */
  112. #define JX_SERVER_ // NULL
  113. /*
  114.  * Create and destory a server to accpet some required client
  115.  */
  116. bool ServerStartup( 
  117. JX_SERVER_
  118. unsigned long ulnAddressToListenOn,
  119. unsigned short usnPortToListenOn,
  120. bool bStartAtOnce
  121. );
  122. void ServerCleanup( JX_SERVER_ );
  123. void InstallCallBack( JX_SERVER_ CALLBACK_SERVER_EVENT pfn );
  124. /*
  125.  * For control the server status
  126.  */
  127. #define SERVER(opt) Server_##opt();
  128. void Server_Start();
  129. void Server_Pause();
  130. void Server_Begin();
  131. void Server_End();
  132. extern inline unsigned long AddClient( 
  133. OnlineGameLib::Win32::CSocketServer::Socket *pSocket,
  134. OnlineGameLib::Win32::CIOBuffer *pAddress);
  135. extern inline unsigned long DelClient( 
  136. OnlineGameLib::Win32::CSocketServer::Socket *pSocket );
  137. extern inline size_t GetClientCount();
  138. extern inline ULONG GetClientAddrIP( const unsigned long &ulnID );
  139. /*
  140.  * Server usage
  141.  */
  142. extern inline void RecvFromClient( 
  143. JX_SERVER_ 
  144. const unsigned long ulnID,
  145. const char *pData, 
  146. size_t dataLength );
  147. extern inline const char *GetFromClient(
  148. const unsigned long ulnID, 
  149. size_t &dataLength );
  150.  
  151. extern inline void SendToClient( 
  152. JX_SERVER_ 
  153. const unsigned long ulnID,
  154. void *pData, 
  155. size_t dataLength );
  156. void ShutdownClient( 
  157. JX_SERVER_ 
  158. const unsigned long ulnID );
  159. #endif // __INCLUDE_JXSERVER_H__