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

模拟服务器

开发平台:

C/C++

  1. // DBRoleServer.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <objbase.h>
  5. #include <initguid.h>
  6. #include <winsock2.h>
  7. #include <process.h>
  8. #include "kprotocoldef.h"
  9. #include "IDBRoleServer.h"
  10. #include "console.h"
  11. #include "Event.h"
  12. #include "macro.h"
  13. #include "Inifile.h"
  14. #include "Utils.h"
  15. #include "tstring.h"
  16. #include "Library.h"
  17. #include "Buffer.h"
  18. #include "CriticalSection.h"
  19. #include "IServer.h"
  20. #include "HeavenInterface.h"
  21. #include "ClientNode.h"
  22. #include <iostream>
  23. #include <strstream>
  24. #include <string>
  25. #include <list>
  26. using namespace std;
  27. using OnlineGameLib::Win32::Console::clrscr;
  28. using OnlineGameLib::Win32::Console::setcolor;
  29. using OnlineGameLib::Win32::CEvent;
  30. using OnlineGameLib::Win32::CIniFile;
  31. using OnlineGameLib::Win32::GetAppFullPath;
  32. using OnlineGameLib::Win32::_tstring;
  33. using OnlineGameLib::Win32::CLibrary;
  34. using OnlineGameLib::Win32::ToString;
  35. using OnlineGameLib::Win32::CPackager;
  36. using OnlineGameLib::Win32::CBuffer;
  37. using OnlineGameLib::Win32::CCriticalSection;
  38. static CLibrary g_theHeavenLibrary( "heaven.dll" );
  39. static CEvent g_hQuitEvent( NULL, true, false );
  40. static CEvent g_hStartWorkEvent( NULL, true, false );
  41. static unsigned short g_nServerPort = 5001;
  42. static IServer *g_pServer = NULL;
  43. static CCriticalSection g_csPlayer;
  44. typedef map< size_t, CClientNode * > stdPlayerMap;
  45. static  stdPlayerMap g_thePlayer;
  46. static CPackager g_theRecv;
  47. static CPackager g_theSend;
  48. typedef HRESULT ( __stdcall * pfnCreateServerInterface )(
  49. REFIID riid,
  50. void **ppv
  51. );
  52. void __stdcall ServerEventNotify(
  53. LPVOID lpParam,
  54. const unsigned long &ulnID,
  55. const unsigned long &ulnEventType )
  56. {
  57. switch( ulnEventType )
  58. {
  59. case enumClientConnectCreate:
  60. {
  61. CClientNode *pNode = CClientNode::AddNode( g_pServer, ulnID );
  62. if ( pNode )
  63. {
  64. CCriticalSection::Owner lock( g_csPlayer );
  65. g_thePlayer.insert( stdPlayerMap::value_type( ulnID, pNode ) );
  66. }
  67. cout << "NO." << ulnID << " was connectted" << endl;
  68. }
  69. break;
  70. case enumClientConnectClose:
  71. {
  72. {
  73. CCriticalSection::Owner lock( g_csPlayer );
  74. stdPlayerMap::iterator it;
  75. if ( g_thePlayer.end() != ( it = g_thePlayer.find( ulnID ) ) )
  76. {
  77. g_thePlayer.erase( ulnID );
  78. }
  79. }
  80. CClientNode::DelNode( ulnID );
  81. cout << "NO." << ulnID << " was disconnectted" << endl;
  82. }
  83. break;
  84. }
  85. }
  86. DWORD WINAPI ThreadProcess( void *pParam )
  87. {
  88. IServer *pServer = ( IServer * )pParam;
  89. ASSERT( pServer );
  90. g_hStartWorkEvent.Wait();
  91. try
  92. {
  93. while ( !g_hQuitEvent.Wait( 0 ) )
  94. {
  95. {
  96. CCriticalSection::Owner lock( g_csPlayer );
  97. stdPlayerMap::iterator it;
  98. for ( it = g_thePlayer.begin(); it != g_thePlayer.end(); it ++ )
  99. {
  100. UINT index = ( *it ).first;
  101. CClientNode *pClientNode = ( *it ).second;
  102. size_t datalength = 0;
  103. const char *pData = ( const char * )pServer->GetPackFromClient( index, datalength );
  104. while ( pClientNode && pData && datalength )
  105. {
  106. pClientNode->AppendData( pData, datalength );
  107. pData = ( const char * )pServer->GetPackFromClient( index, datalength );
  108. }
  109. }
  110. }
  111. ::Sleep( 1 );
  112. }
  113. }
  114. catch(...)
  115. {
  116. ::MessageBox( NULL, "ThreadProcess was error!", "Warning", MB_OK );
  117. }
  118. return 0L;
  119. }
  120. int main(int argc, char* argv[])
  121. {
  122. clrscr();
  123. cout << "Welcome to the DBRoleServer" << endl;
  124. if ( !InitDBInterface() )
  125. {
  126. cout << "Setup dbserver is failed!" << endl;
  127. exit( 0 );
  128. }
  129. /*
  130.  * Open this server to client
  131.  */
  132. pfnCreateServerInterface pFactroyFun = ( pfnCreateServerInterface )( g_theHeavenLibrary.GetProcAddress( "CreateInterface" ) );
  133. IServerFactory *pServerFactory = NULL;
  134. if ( pFactroyFun && SUCCEEDED( pFactroyFun( IID_IServerFactory, reinterpret_cast< void ** >( &pServerFactory ) ) ) )
  135. {
  136. pServerFactory->SetEnvironment( 1000, 10, 20, 1024 * 64 );
  137. pServerFactory->CreateServerInterface( IID_IIOCPServer, reinterpret_cast< void ** >( &g_pServer ) );
  138. pServerFactory->Release();
  139. }
  140. if ( !g_pServer )
  141. {
  142. cout << "Initialization failed! Don't find a correct heaven.dll" << endl;
  143. return -1;
  144. }
  145. g_pServer->Startup();
  146. g_pServer->RegisterMsgFilter( reinterpret_cast< void * >( g_pServer ), ServerEventNotify );
  147. if ( FAILED( g_pServer->OpenService( INADDR_ANY, g_nServerPort ) ) )
  148. {
  149. cout << "Startup server failed!" << endl;
  150. }
  151. DWORD dwThreadID = 0L;
  152. IServer *pCloneServer = NULL;
  153. g_pServer->QueryInterface( IID_IIOCPServer, ( void ** )&pCloneServer );
  154. HANDLE hThread = ::CreateThread( NULL, 0, ThreadProcess, ( void * )pCloneServer, 0, &dwThreadID );
  155. CClientNode::Start( g_pServer );
  156. g_hStartWorkEvent.Set();
  157. cout << "Please 'exit' to end this application!" << endl;
  158. bool quit = false; 
  159. string sCmd;
  160. while ( sCmd.compare( "exit" ) && sCmd.compare( "Exit" ) )
  161. {
  162. cin >> sCmd;
  163. }
  164. CClientNode::End();
  165. g_hQuitEvent.Set();
  166. DWORD result = ::WaitForSingleObject( hThread, 50000 );
  167. if ( result == WAIT_TIMEOUT )
  168. {
  169. ::TerminateThread( hThread, ( DWORD )( -1 ) );
  170. }
  171. if ( hThread != INVALID_HANDLE_VALUE )
  172. {
  173. SAFE_CLOSEHANDLE( hThread );
  174. }
  175. g_pServer->CloseService();
  176. SAFE_RELEASE( g_pServer );
  177. ReleaseDBInterface();
  178. return 0;
  179. }