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

模拟服务器

开发平台:

C/C++

  1. // testAccServer.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <objbase.h>
  5. #include <initguid.h>
  6. #pragma warning(disable : 4786)
  7. #include "KProtocolDef.h"
  8. #include "IClient.h"
  9. #include "RainbowInterface.h"
  10. #include "../../Sword3PaySys/S3AccServer/AccountLoginDef.h"
  11. #include "Library.h"
  12. #include "Macro.h"
  13. #include "Buffer.h"
  14. #include "Event.h"
  15. #include "Console.h"
  16. using OnlineGameLib::Win32::CLibrary;
  17. using OnlineGameLib::Win32::CPackager;
  18. using OnlineGameLib::Win32::CBuffer;
  19. using OnlineGameLib::Win32::CEvent;
  20. using OnlineGameLib::Win32::Console::setcolor;
  21. #include <string>
  22. #include <process.h>
  23. #include <iostream>
  24. #include <stdio.h>
  25. #include "KRelayProtocol.h"
  26. using namespace std;
  27. /*
  28.  * Global variable
  29.  */
  30. CLibrary g_theRainbowDll( "rainbow.dll" );
  31. CBuffer::Allocator m_theGlobalAllocator( 1024 * 1024, 10 );
  32. CEvent m_theQuitThreadEvent( NULL, true, false, "" );
  33. CEvent m_theAfirmThreadQuitEvent( NULL, true, false, "" );
  34. typedef HRESULT ( __stdcall * pfnCreateClientInterface )(
  35. REFIID riid,
  36. void **ppv
  37. );
  38. void __stdcall ClientEventNotify(
  39. LPVOID lpParam,
  40. const unsigned long &ulnEventType )
  41. {
  42. switch( ulnEventType )
  43. {
  44. case enumServerConnectCreate:
  45. cout << "Server connection was created !" << endl;
  46. break;
  47. case enumServerConnectClose:
  48. cout << "Server connection was destroy !"  << endl;
  49. m_theQuitThreadEvent.Set();
  50. break;
  51. }
  52. }
  53. unsigned __stdcall ThreadFunction( void *pParam )
  54. {
  55. IClient *pClient = ( IClient * )pParam;
  56. ASSERT( pClient );
  57. while ( !m_theQuitThreadEvent.Wait( 0 ) )
  58. {
  59. size_t dataLength = 0;
  60. const void *pData = pClient->GetPackFromServer( dataLength );
  61. if ( !pData || 0 == dataLength )
  62. {
  63. Sleep( 1 );
  64. continue;
  65. }
  66. EXTEND_HEADER* pHeader = (EXTEND_HEADER*)pData;
  67. if (pHeader->ProtocolFamily == pf_relay)
  68. {
  69. if (pHeader->ProtocolID == relay_c2c_data)
  70. {
  71. RELAY_DATA* pRelayCmd = (RELAY_DATA*)pData;
  72. in_addr ia;
  73. ia.s_addr = pRelayCmd->nFromIP;
  74. cout << "relaydata: " << inet_ntoa(ia) << '(' << pRelayCmd->nFromRelayID << ')' << " -- recv size: " << dataLength << endl;
  75. }
  76. if (pHeader->ProtocolID == relay_s2c_loseway)
  77. {
  78. RELAY_DATA* pRelayCmd = (RELAY_DATA*)pData;
  79. in_addr ia;
  80. ia.s_addr = pRelayCmd->nFromIP;
  81. cout << "loseway: " << inet_ntoa(ia) << '(' << pRelayCmd->nFromRelayID << ')' << " -- recv size: " << dataLength << endl;
  82. }
  83. }
  84. }
  85. cout << "The read thread was killed safely!" << endl;
  86. m_theAfirmThreadQuitEvent.Set();
  87. return 0;
  88. }
  89. void RelayTo(IClient *pClient, DWORD ipTo, unsigned long idTo)
  90. {
  91. RELAY_DATA serping;
  92. serping.ProtocolFamily = pf_relay;
  93. serping.ProtocolID = relay_c2c_data;
  94. serping.nFromIP = 0;
  95. serping.nFromRelayID = 0;
  96. serping.nToIP = ipTo;
  97. serping.nToRelayID = idTo;
  98. serping.routeDateLength = 0;
  99. pClient->SendPackToServer((const void *)&serping, sizeof(serping));
  100. }
  101. void ServerLogin(IClient *pClient)
  102. {
  103. BYTE mem[sizeof(KServerAccountUserLoginInfo) + 2];
  104. BYTE* pData = mem;
  105. const size_t datalength = sizeof(KServerAccountUserLoginInfo) + 2;
  106. KServerAccountUserLoginInfo serlogin;
  107. serlogin.Size = sizeof(KServerAccountUserLoginInfo);
  108. serlogin.Type = ServerAccountUserLoginInfo;
  109. serlogin.Version = ACCOUNT_CURRENT_VERSION;
  110. strcpy(serlogin.Account, "wanli");
  111. strcpy(serlogin.Password, "48DFFCD3317D5A7B94B26CDCE8710CC7");
  112. *pData = pf_normal;
  113. *(pData + 1) = c2s_gatewayverify;
  114. memcpy(pData + 2, &serlogin, sizeof(KServerAccountUserLoginInfo));
  115. pClient->SendPackToServer((const void *)pData, datalength);
  116. }
  117. /*
  118.  * main
  119.  */
  120. int main(int argc, char* argv[])
  121. {
  122. setcolor( enumCyanonBlack );
  123. cout << "Welcome to the example that it can be to test relay server." << endl << endl;
  124. setcolor( enumDefault );
  125. IClient *pClient = NULL;
  126. pfnCreateClientInterface pFactroyFun = 
  127. (pfnCreateClientInterface)g_theRainbowDll.GetProcAddress("CreateInterface");
  128. IClientFactory *pClientFactory = NULL;
  129.  
  130. ASSERT(pFactroyFun);
  131. if (SUCCEEDED(pFactroyFun(IID_IClientFactory, reinterpret_cast< void ** >(&pClientFactory))))
  132. {
  133. pClientFactory->SetEnvironment(8192);
  134. pClientFactory->CreateClientInterface(IID_IESClient, reinterpret_cast< void ** >(&pClient ));
  135. pClientFactory->Release();
  136. }
  137. ASSERT(pClient);
  138. pClient->Startup();
  139. pClient->RegisterMsgFilter( reinterpret_cast< void * >( pClient ), ClientEventNotify );
  140. //cout << "Relay Server IP: ";
  141. string relayip = "192.168.20.15";
  142. //cin >> relayip;
  143. if ( FAILED( pClient->ConnectTo( relayip.c_str(), 7777 ) ) )
  144. {
  145. cout << "To connect the account server is failed!" << endl;
  146. exit( -1 );
  147. }
  148. IClient *pClonClient = NULL;
  149. pClient->QueryInterface( IID_IESClient, reinterpret_cast< void ** >( &pClonClient ) );
  150. unsigned int threadID = 0;
  151. HANDLE hThread = (HANDLE)::_beginthreadex(0,
  152. 0, 
  153. ThreadFunction,
  154. ( void * )pClonClient,
  155. 0, 
  156. &threadID );
  157. ASSERT( hThread );
  158. SAFE_CLOSEHANDLE( hThread );
  159. //m_theTaskEvent.Wait();
  160. /*
  161.  * System command
  162.  */
  163. _TRY_AGAIN:
  164. if (argc == 1)
  165. {
  166. string sInfo;
  167. cout << "Command:" << endl;
  168. cin >> sInfo;
  169. if (0 == sInfo.compare( "relayto" ))
  170. {
  171. cout << "IP:";
  172. string sip;
  173. cin >> sip;
  174. cout << "id:";
  175. unsigned long id;
  176. cin >> id;
  177. for (int i = 0; i < 1000; i++)
  178. RelayTo(pClient, inet_addr(sip.c_str()), id);
  179. }
  180. else if (0 == sInfo.compare( "serverlogin" ))
  181. {
  182. ServerLogin(pClient);
  183. }
  184. if ( 0 != sInfo.compare( "exit" ))
  185. goto _TRY_AGAIN;
  186. }
  187. else
  188. {
  189. ServerLogin(pClient);
  190. }
  191. m_theQuitThreadEvent.Set();
  192. m_theAfirmThreadQuitEvent.Wait();
  193. pClient->Shutdown();
  194. pClient->Cleanup();
  195. SAFE_RELEASE( pClient );
  196. return 0;
  197. }