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

模拟服务器

开发平台:

C/C++

  1. // RobotManagerDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include <objbase.h>
  5. #include <initguid.h>
  6. #include "RobotManager.h"
  7. #include "RobotManagerDlg.h"
  8. #include "Macro.h"
  9. #include "Buffer.h"
  10. #include "protocol.h"
  11. #include "struct.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. using OnlineGameLib::Win32::CEvent;
  18. using OnlineGameLib::Win32::CCriticalSection;
  19. using OnlineGameLib::Win32::CPackager;
  20. OnlineGameLib::Win32::CLibrary CRobotManagerDlg::m_theHeavenLib( "heaven.dll" );
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CRobotManagerDlg dialog
  23. CRobotManagerDlg::CRobotManagerDlg(CWnd* pParent /*=NULL*/)
  24. : CDialog(CRobotManagerDlg::IDD, pParent)
  25. , m_pManagerServer( NULL )
  26. , m_hThread( NULL )
  27. , m_hQuitThreadEvent( NULL, true, false, "_QuitThreadEvent" )
  28. , m_nCurrentTaskBaseIndex( 0 )
  29. {
  30. //{{AFX_DATA_INIT(CRobotManagerDlg)
  31. m_csAccNameBase = _T("Robot");
  32. m_nAccPerUser = 5;
  33. m_nVariableBegin = 0;
  34. m_nVariableEnd = 9999;
  35. m_csIP1 = _T("...");
  36. m_csIP2 = _T("...");
  37. m_nPort = 5096;
  38. m_csGameServerIP = _T("192.168.22.106");
  39. m_nGameSvrPort = 5622;
  40. //}}AFX_DATA_INIT
  41. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  42. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  43. }
  44. void CRobotManagerDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialog::DoDataExchange(pDX);
  47. //{{AFX_DATA_MAP(CRobotManagerDlg)
  48. DDX_Text(pDX, IDC_EDIT_ACCNAMEBASE, m_csAccNameBase);
  49. DDV_MaxChars(pDX, m_csAccNameBase, 5);
  50. DDX_Text(pDX, IDC_EDIT_ACCUSER, m_nAccPerUser);
  51. DDV_MinMaxInt(pDX, m_nAccPerUser, 0, 100);
  52. DDX_Text(pDX, IDC_EDIT_VARIABLE_BEGIN, m_nVariableBegin);
  53. DDV_MinMaxInt(pDX, m_nVariableBegin, 0, 9999);
  54. DDX_Text(pDX, IDC_EDIT_VARIABLE_END, m_nVariableEnd);
  55. DDV_MinMaxInt(pDX, m_nVariableEnd, 0, 9999);
  56. DDX_Text(pDX, IDC_EDIT_IP1, m_csIP1);
  57. DDX_Text(pDX, IDC_EDIT_IP2, m_csIP2);
  58. DDX_Text(pDX, IDC_EDIT_PORT, m_nPort);
  59. DDV_MinMaxUInt(pDX, m_nPort, 1, 9999);
  60. DDX_Text(pDX, IDC_EDIT_GAMESVR_IP, m_csGameServerIP);
  61. DDX_Text(pDX, IDC_EDIT_GAMESVR_PORT, m_nGameSvrPort);
  62. DDV_MinMaxUInt(pDX, m_nGameSvrPort, 1, 9999);
  63. //}}AFX_DATA_MAP
  64. }
  65. BEGIN_MESSAGE_MAP(CRobotManagerDlg, CDialog)
  66. //{{AFX_MSG_MAP(CRobotManagerDlg)
  67. ON_WM_PAINT()
  68. ON_WM_QUERYDRAGICON()
  69. ON_BN_CLICKED(IDC_BTN_LOGIN_ALLPLAYER, OnBtnLoginAllplayer)
  70. //}}AFX_MSG_MAP
  71. END_MESSAGE_MAP()
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CRobotManagerDlg message handlers
  74. BOOL CRobotManagerDlg::OnInitDialog()
  75. {
  76. CDialog::OnInitDialog();
  77. // Set the icon for this dialog.  The framework does this automatically
  78. //  when the application's main window is not a dialog
  79. SetIcon(m_hIcon, TRUE); // Set big icon
  80. SetIcon(m_hIcon, FALSE); // Set small icon
  81. return TRUE;  // return TRUE  unless you set the focus to a control
  82. }
  83. // If you add a minimize button to your dialog, you will need the code below
  84. //  to draw the icon.  For MFC applications using the document/view model,
  85. //  this is automatically done for you by the framework.
  86. void CRobotManagerDlg::OnPaint() 
  87. {
  88. if (IsIconic())
  89. {
  90. CPaintDC dc(this); // device context for painting
  91. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  92. // Center icon in client rectangle
  93. int cxIcon = GetSystemMetrics(SM_CXICON);
  94. int cyIcon = GetSystemMetrics(SM_CYICON);
  95. CRect rect;
  96. GetClientRect(&rect);
  97. int x = (rect.Width() - cxIcon + 1) / 2;
  98. int y = (rect.Height() - cyIcon + 1) / 2;
  99. // Draw the icon
  100. dc.DrawIcon(x, y, m_hIcon);
  101. }
  102. else
  103. {
  104. CDialog::OnPaint();
  105. }
  106. }
  107. // The system calls this to obtain the cursor to display while the user drags
  108. //  the minimized window.
  109. HCURSOR CRobotManagerDlg::OnQueryDragIcon()
  110. {
  111. return (HCURSOR) m_hIcon;
  112. }
  113. void CRobotManagerDlg::OnOK() 
  114. {
  115. EnableGroupCtrl( FALSE );
  116. UpdateData( TRUE );
  117. m_nCurrentTaskBaseIndex = m_nVariableBegin;
  118. if ( !StartupServer() )
  119. {
  120. EnableGroupCtrl( TRUE );
  121. }
  122. }
  123. void CRobotManagerDlg::OnCancel() 
  124. {
  125. DestroyServer();
  126. UpdateData( FALSE );
  127. EnableGroupCtrl( TRUE );
  128. CDialog::OnCancel();
  129. }
  130. DWORD WINAPI CRobotManagerDlg::ThreadFunc( LPVOID lpParam )
  131. {
  132. CRobotManagerDlg *pThis = ( CRobotManagerDlg * )lpParam;
  133. ASSERT( pThis );
  134. DWORD dwValue = 0;
  135. try
  136. {
  137. dwValue = pThis->Working();
  138. }
  139. catch(...)
  140. {}
  141. return dwValue;
  142. }
  143. DWORD CRobotManagerDlg::Working()
  144. {
  145. if ( !m_pManagerServer )
  146. {
  147. return -1;
  148. }
  149. while ( !m_hQuitThreadEvent.Wait( 0 ) )
  150. {
  151. const void *pData = NULL;
  152. size_t datalength = 0;
  153. CCriticalSection::Owner locker( m_csUL );
  154. stdList::iterator it;
  155. for ( it = m_theUserList.begin(); it != m_theUserList.end(); it ++ )
  156. {
  157. size_t index = ( *it );
  158. pData = m_pManagerServer->GetPackFromClient( index, datalength );
  159. if ( !pData || 0 == datalength )
  160. {
  161. continue;
  162. }
  163. BYTE cProtocol = CPackager::Peek( pData );
  164. switch ( cProtocol )
  165. {
  166. case enumRequireTask:
  167. {
  168. size_t lenAccInfo = 0;
  169. char *pAccInfo = ( char * )GetAccInfo( lenAccInfo );
  170. if ( pAccInfo && lenAccInfo )
  171. {
  172. m_pManagerServer->SendData( index, pAccInfo, lenAccInfo );
  173. SAFE_DELETE( pAccInfo );
  174. }
  175. }
  176. break;
  177. case enumRobotQuit:
  178. {
  179. tagRobotQuit* RobotQuit = (tagRobotQuit*)pData;
  180. }
  181. default:
  182. break;
  183. }
  184. }
  185. ::Sleep( 1 );
  186. }
  187. return 0L;
  188. }
  189. void *CRobotManagerDlg::GetAccInfo( size_t &datalength )
  190. {
  191. CCriticalSection::Owner locker( m_csCTBI );
  192. if ( m_nAccPerUser > 0 &&
  193. m_nCurrentTaskBaseIndex >= m_nVariableBegin &&
  194. ( m_nCurrentTaskBaseIndex + m_nAccPerUser ) < m_nVariableEnd )
  195. {
  196. CString csAccName;
  197. int nAccBeginIndex = m_nCurrentTaskBaseIndex;
  198. int nAccEndIndex = m_nCurrentTaskBaseIndex + m_nAccPerUser;
  199. size_t nAccCount = nAccEndIndex - nAccBeginIndex;
  200. csAccName.Format( "%s%4.4d", m_csAccNameBase, 0 );
  201. size_t nNameLen = strlen( csAccName );
  202. datalength = sizeof( tagDspT_INFO ) + nAccCount * nNameLen;
  203. tagDspT_INFO *pDTI = ( tagDspT_INFO * )new char[ datalength ];
  204. ASSERT( pDTI );
  205. ZeroMemory( ( char * )pDTI, datalength );
  206. pDTI->cProtocol = enumDispatchTask;
  207. strcpy( pDTI->theGameSvrInfo.szIP, m_csGameServerIP );
  208. pDTI->theGameSvrInfo.nPort = m_nGameSvrPort;
  209. pDTI->nAccCount = nAccCount;
  210. pDTI->nNameLen = nNameLen;
  211. pDTI->dwVersion = 1;
  212. char *pAccName = pDTI->szAccName;
  213. int nIndex = 0;
  214. for ( int i=nAccBeginIndex; i< nAccEndIndex; i ++ )
  215. {
  216. csAccName.Format( "%s%4.4d", m_csAccNameBase, i );
  217. memcpy( pAccName, csAccName, nNameLen );
  218. pAccName += nNameLen;
  219. }
  220. m_nCurrentTaskBaseIndex = nAccEndIndex;
  221. return ( void * )pDTI;
  222. }
  223. datalength = 0;
  224. return NULL;
  225. }
  226. bool CRobotManagerDlg::StartupServer()
  227. {
  228. if ( m_pManagerServer )
  229. {
  230. return true;
  231. }
  232. bool ok = false;
  233. /*
  234.  * We open the heaven to wait for the rainbow
  235.  */
  236. pfnCreateServerInterface pServerFactroyFun = 
  237. ( pfnCreateServerInterface )( m_theHeavenLib.GetProcAddress( _T( "CreateInterface" ) ) );
  238. IServerFactory *pServerFactory = NULL;
  239. if ( pServerFactroyFun && 
  240. SUCCEEDED( pServerFactroyFun( IID_IServerFactory, reinterpret_cast< void ** >( &pServerFactory ) ) ) )
  241. {
  242. pServerFactory->SetEnvironment( 1000, 10, 500, 1024 * 8 );
  243. pServerFactory->CreateServerInterface( IID_IIOCPServer, reinterpret_cast< void ** >( &m_pManagerServer ) );
  244. pServerFactory->Release();
  245. }
  246. if ( m_pManagerServer )
  247. {
  248. m_pManagerServer->Startup();
  249. m_pManagerServer->RegisterMsgFilter( reinterpret_cast< void * >( this ), SvrEventNotify );
  250. if ( SUCCEEDED( m_pManagerServer->OpenService( INADDR_ANY, m_nPort ) ) )
  251. {
  252. ok = true;
  253. }
  254. }
  255. DWORD dwThreadID = 0;
  256. HANDLE hThread = ::CreateThread( NULL, 0, ThreadFunc, ( void * )this, 0, &dwThreadID );
  257. SAFE_CLOSEHANDLE( hThread );
  258. return ok;
  259. }
  260. void CRobotManagerDlg::DestroyServer()
  261. {
  262. m_hQuitThreadEvent.Set();
  263. /*
  264.  * Disconnect network and relase this resource
  265.  */
  266. if ( m_pManagerServer )
  267. {
  268. m_pManagerServer->CloseService();
  269. m_pManagerServer->Cleanup();
  270. SAFE_RELEASE( m_pManagerServer );
  271. }
  272. }
  273. void __stdcall CRobotManagerDlg::SvrEventNotify( LPVOID lpParam,
  274. const unsigned long &ulnID,
  275. const unsigned long &ulnEventType )
  276. {
  277. CRobotManagerDlg *pThis = reinterpret_cast< CRobotManagerDlg * >( lpParam );
  278. ASSERT( pThis );
  279. try
  280. {
  281. pThis->_ServerEventNotify( ulnID, ulnEventType );
  282. }
  283. catch(...)
  284. {}
  285. }
  286. void CRobotManagerDlg::_ServerEventNotify( const unsigned long &ulnID,
  287. const unsigned long &ulnEventType )
  288. {
  289. CCriticalSection::Owner locker( m_csUL );
  290. switch ( ulnEventType )
  291. {
  292. case enumClientConnectCreate:
  293. m_theUserList.push_back( ulnID );
  294. break;
  295. case enumClientConnectClose:
  296. m_theUserList.remove( ulnID );
  297. break;
  298. }
  299. }
  300. void CRobotManagerDlg::EnableGroupCtrl( BOOL bEnable /*= TRUE*/ )
  301. {
  302. EnableCtrl( IDC_EDIT_PORT, bEnable );
  303. EnableCtrl( IDC_EDIT_ACCNAMEBASE, bEnable );
  304. EnableCtrl( IDC_EDIT_VARIABLE_BEGIN, bEnable );
  305. EnableCtrl( IDC_EDIT_VARIABLE_END, bEnable );
  306. EnableCtrl( IDC_EDIT_ACCUSER, bEnable );
  307. EnableCtrl( IDOK, bEnable );
  308. EnableCtrl( IDC_EDIT_GAMESVR_IP, bEnable );
  309. EnableCtrl( IDC_EDIT_GAMESVR_PORT, bEnable );
  310. EnableCtrl( IDC_BTN_LOGIN_ALLPLAYER, !bEnable );
  311. }
  312. void CRobotManagerDlg::OnBtnLoginAllplayer() 
  313. {
  314. static bool bLogin = true;
  315. EnableCtrl( IDC_BTN_LOGIN_ALLPLAYER, FALSE );
  316. {
  317. CCriticalSection::Owner locker( m_csUL );
  318. size_t datalength = 0;
  319. stdList::iterator it;
  320. for ( it = m_theUserList.begin(); it != m_theUserList.end(); it ++ )
  321. {
  322. size_t index = ( *it );
  323. //m_pManagerServer->SendData( index, "test", 4 );
  324. }
  325. }
  326. if ( bLogin )
  327. {
  328. SetText( IDC_BTN_LOGIN_ALLPLAYER, "Let's all player to logout server" );
  329. }
  330. else
  331. {
  332. SetText( IDC_BTN_LOGIN_ALLPLAYER, "Let's all player to login server" );
  333. }
  334. bLogin = !bLogin;
  335. EnableCtrl( IDC_BTN_LOGIN_ALLPLAYER, TRUE );
  336. }