诸暨麻将添加redis
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

711 Zeilen
19 KiB

  1. #include "StdAfx.h"
  2. #include "TraceService.h" // #include "EventService.h"
  3. #include "AttemperEngine.h"
  4. #include <string>
  5. #include "../curl-7.32.0/include/curl/curl.h"
  6. #include "ChineseCode.h"
  7. #include "../Json/json.h"
  8. #include "AES.h"
  9. #include "ZBase64.h"
  10. //////////////////////////////////////////////////////////////////////////
  11. //构造函数
  12. CAttemperEngine::CAttemperEngine(void)
  13. {
  14. m_bService = false;
  15. m_pITCPSocketService = NULL;
  16. m_pTCPNetworkEngine = NULL;
  17. m_pIAttemperEngineSink = NULL;
  18. return;
  19. }
  20. //析构函数
  21. CAttemperEngine::~CAttemperEngine(void)
  22. {
  23. }
  24. //接口查询
  25. void * CAttemperEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  26. {
  27. QUERYINTERFACE(IAttemperEngine, Guid, dwQueryVer);
  28. QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
  29. QUERYINTERFACE(IDataBaseEngineEvent, Guid, dwQueryVer);
  30. QUERYINTERFACE(ITCPNetworkEngineEvent, Guid, dwQueryVer);
  31. QUERYINTERFACE_IUNKNOWNEX(IAttemperEngine, Guid, dwQueryVer);
  32. return NULL;
  33. }
  34. //启动服务
  35. bool CAttemperEngine::StartService()
  36. {
  37. //判断状态
  38. if (m_bService == true)
  39. {
  40. CTraceService::TraceString(TEXT("调度引擎重复启动,启动操作忽略"), TraceLevel_Warning);
  41. return true;
  42. }
  43. //外挂接口
  44. if (m_pIAttemperEngineSink == NULL)
  45. {
  46. CTraceService::TraceString(TEXT("调度引擎外挂服务不存在"), TraceLevel_Exception);
  47. return false;
  48. }
  49. //设置队列
  50. if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  51. {
  52. CTraceService::TraceString(TEXT("调度引擎与队列服务绑定失败"), TraceLevel_Exception);
  53. return false;
  54. }
  55. //启动外挂
  56. if (m_pIAttemperEngineSink->OnAttemperEngineStart(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  57. {
  58. CTraceService::TraceString(TEXT("调度引擎外挂服务启动失败"), TraceLevel_Exception);
  59. return false;
  60. }
  61. //启动队列
  62. if (m_QueueService.StartService() == false)
  63. {
  64. CTraceService::TraceString(TEXT("调度引擎队列服务启动失败"), TraceLevel_Exception);
  65. return false;
  66. }
  67. //清空机器人
  68. m_AndroidUserSocketIDArray.RemoveAll();
  69. //设置变量
  70. m_bService = true;
  71. return true;
  72. }
  73. //停止服务
  74. bool CAttemperEngine::ConcludeService()
  75. {
  76. //设置变量
  77. m_bService = false;
  78. //停止请求队列
  79. m_QueueService.ConcludeService();
  80. //停止外挂
  81. if (m_pIAttemperEngineSink != NULL)
  82. {
  83. m_pIAttemperEngineSink->OnAttemperEngineConclude(QUERY_ME_INTERFACE(IUnknownEx));
  84. m_pIAttemperEngineSink = NULL;
  85. }
  86. //清空机器人
  87. m_AndroidUserSocketIDArray.RemoveAll();
  88. return true;
  89. }
  90. //设置网络
  91. bool CAttemperEngine::SetSocketEngine(IUnknownEx * pIUnknownEx)
  92. {
  93. ASSERT(pIUnknownEx != NULL);
  94. m_pITCPSocketService = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, ITCPSocketService);
  95. ASSERT(m_pITCPSocketService != NULL);
  96. return (m_pITCPSocketService != NULL);
  97. }
  98. //设置网络
  99. bool CAttemperEngine::SetNetworkEngine(IUnknownEx * pIUnknownEx)
  100. {
  101. ASSERT(pIUnknownEx != NULL);
  102. m_pTCPNetworkEngine = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, ITCPNetworkEngine);
  103. ASSERT(m_pTCPNetworkEngine != NULL);
  104. return (m_pTCPNetworkEngine != NULL);
  105. }
  106. #pragma region <<程序验证使用时限>>
  107. //需要转UTF-8字符编码格式
  108. //const char g_key[17] = "asdfwetyhjuytrfd";
  109. //const char g_iv[17] = "302";
  110. string EncryptionAES(const string& strSrc, const char g_iv[17],const char g_key[17]) //AES加密
  111. {
  112. size_t length = strSrc.length();
  113. int block_num = length / BLOCK_SIZE + 1;
  114. //明文
  115. char* szDataIn = new char[block_num * BLOCK_SIZE + 1];
  116. memset(szDataIn, 0x00, block_num * BLOCK_SIZE + 1);
  117. memcpy(szDataIn, strSrc.c_str(), strSrc.size());
  118. //进行PKCS7Padding填充。
  119. int k = length % BLOCK_SIZE;
  120. int j = length / BLOCK_SIZE;
  121. int padding = BLOCK_SIZE - k;
  122. for (int i = 0; i < padding; i++)
  123. {
  124. szDataIn[j * BLOCK_SIZE + k + i] = padding;
  125. }
  126. szDataIn[block_num * BLOCK_SIZE] = '\0';
  127. //加密后的密文
  128. char *szDataOut = new char[block_num * BLOCK_SIZE + 1];
  129. memset(szDataOut, 0, block_num * BLOCK_SIZE + 1);
  130. //进行进行AES的CBC模式加密
  131. AES aes;
  132. aes.MakeKey(g_key, g_iv, 16, 16);
  133. aes.Encrypt(szDataIn, szDataOut, block_num * BLOCK_SIZE, AES::CBC);
  134. string str = base64_encode((unsigned char*)szDataOut,
  135. block_num * BLOCK_SIZE);
  136. delete[] szDataIn;
  137. delete[] szDataOut;
  138. return str;
  139. }
  140. string DecryptionAES(const string& strSrc, const char g_iv[17], const char g_key[17]) //AES解密
  141. {
  142. string strData = base64_decode(strSrc);
  143. size_t length = strData.length();
  144. //密文
  145. char *szDataIn = new char[length + 1];
  146. memcpy(szDataIn, strData.c_str(), length + 1);
  147. //明文
  148. char *szDataOut = new char[length + 1];
  149. memcpy(szDataOut, strData.c_str(), length + 1);
  150. //进行AES的CBC模式解密
  151. AES aes;
  152. aes.MakeKey(g_key, g_iv, 16, 16);
  153. aes.Decrypt(szDataIn, szDataOut, length, AES::CBC);
  154. //去PKCS7Padding填充
  155. if (0x00 < szDataOut[length - 1] && szDataOut[length - 1] <= 0x16)
  156. {
  157. int tmp = szDataOut[length - 1];
  158. for (int i = length - 1; i >= (static_cast<int>(length) - tmp); i--)
  159. {
  160. if (szDataOut[i] != tmp)
  161. {
  162. memset(szDataOut, 0, length);
  163. cout << "去填充失败!解密出错!!" << endl;
  164. break;
  165. }
  166. else
  167. szDataOut[i] = 0;
  168. }
  169. }
  170. string strDest(szDataOut);
  171. delete[] szDataIn;
  172. delete[] szDataOut;
  173. return strDest;
  174. }
  175. static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
  176. {
  177. std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
  178. if (NULL == str || NULL == buffer)
  179. {
  180. return -1;
  181. }
  182. char* pData = (char*)buffer;
  183. str->append(pData, size * nmemb);
  184. return nmemb;
  185. }
  186. static int Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse)
  187. {
  188. CURLcode res;
  189. CURL* curl = curl_easy_init();
  190. if (NULL == curl)
  191. {
  192. return CURLE_FAILED_INIT;
  193. }
  194. /*if (m_bDebug)
  195. {
  196. curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
  197. curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
  198. }*/
  199. curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
  200. curl_easy_setopt(curl, CURLOPT_POST, 1);
  201. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());
  202. curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
  203. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
  204. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
  205. curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
  206. curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
  207. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
  208. res = curl_easy_perform(curl);
  209. curl_easy_cleanup(curl);
  210. return res;
  211. }
  212. // 获取 验证码
  213. static bool OnGetVerificationCode()
  214. {
  215. DWORD dStart = GetTickCount();
  216. CString csGet = _T(""), HttpPath = _T("");
  217. #ifdef _DEBUG
  218. HttpPath.Format(_T("http://192.168.0.223:8084/game/validate/secret"));
  219. #else
  220. HttpPath.Format(_T("http://cycz.legaogame.com/game/validate/secret"));
  221. #endif
  222. CTime t = CTime::GetCurrentTime();
  223. CString time = t.Format("%Y%m%d%H%M%S");
  224. CString key = _T("VwZkLv0m0G^5T@2v");
  225. //内容AES加密 (CBC[128]+PKCS7Padding+base64)
  226. CString secret;//
  227. string strContent = "dPBmFWuzQkxrxbR8";
  228. char p0[1024] = { 0 };
  229. CopyMemory(p0, strContent.c_str(), strContent.size());
  230. *(p0 + strContent.size()) = '\0';//注意手动加结束符!!!
  231. string strUtf8;
  232. CChineseCode::GB2312ToUTF_8(strUtf8, p0, strContent.size());//转UTF-8
  233. const char g_key[17] = "dPBmFWuzQkxrxbR8";//秘钥
  234. const char g_iv[17] = "cyhh01";//偏移量
  235. string strEnc = EncryptionAES(strUtf8, g_iv, g_key);
  236. secret = strEnc.c_str();
  237. //MD5加密
  238. CString stringSource = _T(""), stringTarget = _T("");
  239. TCHAR strTemp[LEN_MD5];
  240. stringSource.Format(_T("%s%s%s"), secret, time, key);
  241. CWHEncrypt::MD5Encrypt(stringSource, strTemp); //生成加密串
  242. stringTarget.Format(_T("%s"), strTemp);
  243. csGet.Format(_T("secret=%s&time=%s&sign=%s"), secret, time, stringTarget);
  244. const std::string szUrl = CW2AEX<1024>(HttpPath).m_psz;
  245. const std::string szParam = CW2AEX<1024>(csGet).m_psz;
  246. std::string csRet;
  247. const int iRet = Post(szUrl, szParam, csRet);
  248. if (CURLE_OK == iRet)
  249. {
  250. string strDecryption = DecryptionAES(csRet, g_iv, g_key), strGB2312;//解密
  251. char p1[256] = { 0 };
  252. CopyMemory(p1, strDecryption.c_str(), strDecryption.size());
  253. *(p1 + strDecryption.size()) = '\0';//注意手动加结束符!!!
  254. CChineseCode::UTF_8ToGB2312(strGB2312, p1, strDecryption.size());
  255. dStart = GetTickCount() - dStart;
  256. CString strTip;
  257. strTip.Format(L"校验请求:%s,Post:%s,返回数据:%s,返回值iRet:%d,消耗时间:%d", csGet, HttpPath, static_cast<CString>(strGB2312.c_str()), iRet, dStart);
  258. //剩余天数判断
  259. const int ndayNum = atoi(strGB2312.c_str());
  260. if (0 < ndayNum)
  261. {
  262. return true;
  263. }
  264. ////解析返回的数据
  265. //Json::Reader m_reader;
  266. //Json::Value m_root;
  267. //std::string strbb(CW2A(csRetUnicode.GetString()));
  268. //if (!m_reader.parse(strbb, m_root))
  269. // return false;
  270. //int nCode = 0;
  271. //if (m_root["Code"].isString())
  272. //{
  273. // std::string Cmd = m_root["Code"].asString();
  274. // //aes解密
  275. // //...
  276. // //nCode = static_cast<INT>(atoi(m_root["Code"].asString().c_str()));
  277. //}
  278. //else if (m_root["Code"].isInt()){
  279. // nCode = static_cast<INT>(m_root["Code"].asInt());
  280. //}
  281. }
  282. return false;
  283. }
  284. #pragma endregion
  285. //注册钩子
  286. bool CAttemperEngine::SetAttemperEngineSink(IUnknownEx * pIUnknownEx)
  287. {
  288. #ifndef _DEBUG
  289. //请求验证服务器 软件是否超过有效使用时限 2019-5-15 ADD L
  290. if (!OnGetVerificationCode())
  291. {
  292. //abort();
  293. exit(-1);
  294. }
  295. #endif
  296. //效验参数
  297. ASSERT(pIUnknownEx != NULL);
  298. ASSERT(m_pIAttemperEngineSink == NULL);
  299. if (pIUnknownEx == NULL) return false;
  300. if (m_pIAttemperEngineSink != NULL) return false;
  301. //查询接口
  302. m_pIAttemperEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAttemperEngineSink);
  303. if (m_pIAttemperEngineSink == NULL)
  304. {
  305. CTraceService::TraceString(TEXT("调度引擎外挂服务接口获取失败,挂接操作失败"), TraceLevel_Exception);
  306. return false;
  307. }
  308. return true;
  309. }
  310. //获取接口
  311. void * CAttemperEngine::GetQueueService(const IID & Guid, DWORD dwQueryVer)
  312. {
  313. return m_QueueService.QueryInterface(Guid, dwQueryVer);
  314. }
  315. //控制事件
  316. //////////////////////////////////////////////////////////////////////////
  317. //自定事件
  318. bool CAttemperEngine::OnEventCustom(WORD wRequestID, VOID * pData, WORD wDataSize)
  319. {
  320. ASSERT(m_pIAttemperEngineSink);
  321. if (m_pIAttemperEngineSink == NULL) return false;
  322. return m_pIAttemperEngineSink->OnEventAttemperData(wRequestID, pData, wDataSize);
  323. }
  324. //控制事件
  325. bool CAttemperEngine::OnEventControl(WORD wControlID, VOID * pData, WORD wDataSize)
  326. {
  327. ASSERT(m_pIAttemperEngineSink);
  328. if (m_pIAttemperEngineSink == NULL) return false;
  329. return m_pIAttemperEngineSink->OnEventControl(wControlID, pData, wDataSize);
  330. }
  331. //队列接口
  332. void CAttemperEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
  333. {
  334. //内核事件
  335. ASSERT(m_pIAttemperEngineSink != NULL);
  336. switch (wIdentifier)
  337. {
  338. case EVENT_TCP_TONGBU:
  339. {
  340. //效验参数
  341. ASSERT(wDataSize >= 8);
  342. if (wDataSize < 8) return;
  343. int* iCommend = (int *)pBuffer;
  344. int* pSecond = iCommend + 1;
  345. char *pData = (char *)pBuffer;
  346. pData = pData + 8;
  347. try
  348. {
  349. if (m_pIAttemperEngineSink) m_pIAttemperEngineSink->OnTongBu(*iCommend, *pSecond, pData, wDataSize - 8);
  350. }
  351. catch (...)
  352. {
  353. }
  354. return;
  355. }
  356. case EVENT_TIMER: //定时器事件
  357. {
  358. //效验参数
  359. ASSERT(wDataSize == sizeof(NTY_TimerEvent));
  360. if (wDataSize != sizeof(NTY_TimerEvent)) return;
  361. //处理消息
  362. NTY_TimerEvent * pTimerEvent = (NTY_TimerEvent *)pBuffer;
  363. try
  364. {
  365. if (m_pIAttemperEngineSink) m_pIAttemperEngineSink->OnEventTimer(pTimerEvent->dwTimerID, pTimerEvent->dwBindParameter);
  366. }
  367. catch (...)
  368. {
  369. }
  370. return;
  371. }
  372. case EVENT_DATABASE: //数据库事件
  373. {
  374. //效验参数
  375. ASSERT(wDataSize >= sizeof(NTY_DataBaseEvent));
  376. if (wDataSize < sizeof(NTY_DataBaseEvent)) return;
  377. //处理消息
  378. NTY_DataBaseEvent * pDataBaseEvent = (NTY_DataBaseEvent *)pBuffer;
  379. try
  380. {
  381. if (m_pIAttemperEngineSink) m_pIAttemperEngineSink->OnEventDataBase(pDataBaseEvent->wRequestID, pDataBaseEvent->dwContextID, pDataBaseEvent + 1, wDataSize - sizeof(NTY_DataBaseEvent));
  382. }
  383. catch (...)
  384. {
  385. }
  386. return;
  387. }
  388. case EVENT_TCP_NETWORK_ACCEPT: //网络应答事件
  389. {
  390. //效验大小
  391. ASSERT(wDataSize == sizeof(NTY_TCPNetworkAcceptEvent));
  392. if (wDataSize != sizeof(NTY_TCPNetworkAcceptEvent)) return;
  393. //处理消息
  394. NTY_TCPNetworkAcceptEvent * pSocketAcceptEvent = (NTY_TCPNetworkAcceptEvent *)pBuffer;
  395. bool bSuccess = false;
  396. try
  397. {
  398. if (m_pIAttemperEngineSink) bSuccess = m_pIAttemperEngineSink->OnEventTCPNetworkBind(pSocketAcceptEvent->dwClientAddr, pSocketAcceptEvent->dwSocketID);
  399. }
  400. catch (...) {}
  401. if (bSuccess == false)
  402. {
  403. m_pTCPNetworkEngine->CloseSocket(pSocketAcceptEvent->dwSocketID);
  404. }
  405. return;
  406. }
  407. case EVENT_TCP_NETWORK_READ: //网络读取事件
  408. {
  409. //效验大小
  410. NTY_TCPNetworkReadEvent * pSocketReadEvent = (NTY_TCPNetworkReadEvent *)pBuffer;
  411. ASSERT(wDataSize >= sizeof(NTY_TCPNetworkReadEvent));
  412. ASSERT(wDataSize == (sizeof(NTY_TCPNetworkReadEvent) + pSocketReadEvent->wDataSize));
  413. if (wDataSize < sizeof(NTY_TCPNetworkReadEvent)) return;
  414. if (wDataSize != (sizeof(NTY_TCPNetworkReadEvent) + pSocketReadEvent->wDataSize)) return;
  415. //处理消息
  416. bool bSuccess = false;
  417. try
  418. {
  419. if (m_pIAttemperEngineSink) bSuccess = m_pIAttemperEngineSink->OnEventTCPNetworkRead(pSocketReadEvent->Command, pSocketReadEvent + 1, pSocketReadEvent->wDataSize, pSocketReadEvent->dwSocketID);
  420. }
  421. catch (...) {}
  422. if (bSuccess == false)
  423. {
  424. m_pTCPNetworkEngine->CloseSocket(pSocketReadEvent->dwSocketID);
  425. }
  426. return;
  427. }
  428. case EVENT_TCP_NETWORK_SHUT: //关闭读取事件
  429. {
  430. //效验大小
  431. ASSERT(wDataSize == sizeof(NTY_TCPNetworkShutEvent));
  432. if (wDataSize != sizeof(NTY_TCPNetworkShutEvent)) return;
  433. //处理消息
  434. NTY_TCPNetworkShutEvent * pSocketCloseEvent = (NTY_TCPNetworkShutEvent *)pBuffer;
  435. bool bSuccess = false;
  436. try
  437. {
  438. if (m_pIAttemperEngineSink) bSuccess = m_pIAttemperEngineSink->OnEventTCPNetworkShut(pSocketCloseEvent->dwClientAddr, pSocketCloseEvent->dwActiveTime, pSocketCloseEvent->dwSocketID);
  439. }
  440. catch (...) {}
  441. if (bSuccess == false)
  442. {
  443. m_pTCPNetworkEngine->CloseSocket(pSocketCloseEvent->dwSocketID);
  444. }
  445. return;
  446. }
  447. case EVENT_TCP_SOCKET_READ: //网络读取事件
  448. {
  449. //效验大小
  450. NTY_TCPSocketReadEvent * pSocketReadEvent = (NTY_TCPSocketReadEvent *)pBuffer;
  451. ASSERT(wDataSize >= sizeof(NTY_TCPSocketReadEvent));
  452. ASSERT(wDataSize == (sizeof(NTY_TCPSocketReadEvent) + pSocketReadEvent->wDataSize));
  453. if (wDataSize < sizeof(NTY_TCPSocketReadEvent)) return;
  454. if (wDataSize != (sizeof(NTY_TCPSocketReadEvent) + pSocketReadEvent->wDataSize)) return;
  455. //处理消息
  456. bool bSuccess = false;
  457. try
  458. {
  459. if (m_pIAttemperEngineSink) bSuccess = m_pIAttemperEngineSink->OnEventTCPSocketRead(pSocketReadEvent->wServiceID, pSocketReadEvent->Command, pSocketReadEvent + 1, pSocketReadEvent->wDataSize);
  460. }
  461. catch (...) {}
  462. if (bSuccess == false)
  463. {
  464. if (m_pITCPSocketService)
  465. m_pITCPSocketService->CloseSocket();
  466. }
  467. return;
  468. }
  469. case EVENT_TCP_SOCKET_SHUT: //网络关闭事件
  470. {
  471. //效验大小
  472. ASSERT(wDataSize == sizeof(NTY_TCPSocketShutEvent));
  473. if (wDataSize != sizeof(NTY_TCPSocketShutEvent)) return;
  474. //处理消息
  475. NTY_TCPSocketShutEvent * pSocketCloseEvent = (NTY_TCPSocketShutEvent *)pBuffer;
  476. bool bSuccess = false;
  477. try
  478. {
  479. if (m_pIAttemperEngineSink) bSuccess = m_pIAttemperEngineSink->OnEventTCPSocketShut(pSocketCloseEvent->wServiceID, pSocketCloseEvent->cbShutReason);
  480. }
  481. catch (...) {}
  482. if (bSuccess == false)
  483. m_pITCPSocketService->CloseSocket();
  484. return;
  485. }
  486. case EVENT_TCP_SOCKET_LINK:
  487. {
  488. //效验大小
  489. ASSERT(wDataSize == sizeof(NTY_TCPSocketLinkEvent));
  490. if (wDataSize != sizeof(NTY_TCPSocketLinkEvent)) return;
  491. //处理消息
  492. NTY_TCPSocketLinkEvent * pSocketCloseEvent = (NTY_TCPSocketLinkEvent *)pBuffer;
  493. bool bSuccess = false;
  494. try
  495. {
  496. if (m_pIAttemperEngineSink) bSuccess = m_pIAttemperEngineSink->OnEventTCPSocketLink(pSocketCloseEvent->wServiceID, pSocketCloseEvent->nErrorCode);
  497. }
  498. catch (...) {}
  499. if (bSuccess == false)
  500. m_pITCPSocketService->CloseSocket();
  501. return;
  502. }
  503. case EVENT_CONTROL:
  504. {
  505. //效验大小
  506. ASSERT(wDataSize == sizeof(NTY_ControlEvent));
  507. if (wDataSize != sizeof(NTY_ControlEvent)) return;
  508. //处理消息
  509. NTY_ControlEvent * pControlEvent = (NTY_ControlEvent *)pBuffer;
  510. try
  511. {
  512. if (m_pIAttemperEngineSink) m_pIAttemperEngineSink->OnEventControl(wIdentifier, pBuffer, wDataSize);
  513. }
  514. catch (...) {}
  515. return;
  516. }
  517. }
  518. //其他事件
  519. try
  520. {
  521. if (m_pIAttemperEngineSink) m_pIAttemperEngineSink->OnEventAttemperData(wIdentifier, pBuffer, wDataSize);
  522. }
  523. catch (...) {}
  524. return;
  525. }
  526. bool CAttemperEngine::OnEventDataBaseResult(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
  527. {
  528. try
  529. {
  530. if (!m_pIAttemperEngineSink) return false;
  531. return m_pIAttemperEngineSink->OnEventDataBase(wRequestID, dwContextID, pData, wDataSize);
  532. }
  533. catch (...)
  534. {
  535. return false;
  536. }
  537. }
  538. //机器模拟接口
  539. //////////////////////////////////////////////////////////////////////////
  540. //应答事件
  541. bool CAttemperEngine::OnEventTCPNetworkBind(DWORD dwSocketID, DWORD dwClientIP)
  542. {
  543. //缓冲锁定
  544. CWHDataLocker lock(m_CriticalSection);
  545. try
  546. {
  547. m_AndroidUserSocketIDArray.Add(dwSocketID);
  548. m_pIAttemperEngineSink->OnEventTCPNetworkBind(dwClientIP, dwSocketID);
  549. }
  550. catch (...) { return false; }
  551. return true;
  552. }
  553. //关闭事件
  554. bool CAttemperEngine::OnEventTCPNetworkShut(DWORD dwSocketID, DWORD dwClientIP, DWORD dwActiveTime)
  555. {
  556. //缓冲锁定
  557. CWHDataLocker lock(m_CriticalSection);
  558. try
  559. {
  560. for (int i = 0; i < m_AndroidUserSocketIDArray.GetCount(); i++)
  561. {
  562. if (dwSocketID == m_AndroidUserSocketIDArray[i])
  563. {
  564. m_AndroidUserSocketIDArray.RemoveAt(i);
  565. break;
  566. }
  567. }
  568. m_pIAttemperEngineSink->OnEventTCPNetworkShut(dwClientIP, dwActiveTime, dwSocketID);
  569. }
  570. catch (...) { return false; }
  571. return true;
  572. }
  573. //读取事件
  574. bool CAttemperEngine::OnEventTCPNetworkRead(DWORD dwSocketID, TCP_Command Command, VOID * pData, WORD wDataSize)
  575. {
  576. //缓冲锁定
  577. CWHDataLocker lock(m_CriticalSection);
  578. try
  579. {
  580. bool bIsConnected = false;
  581. for (int i = 0; i < m_AndroidUserSocketIDArray.GetCount(); i++)
  582. {
  583. if (dwSocketID == m_AndroidUserSocketIDArray[i])
  584. {
  585. bIsConnected = true;
  586. break;
  587. }
  588. }
  589. ASSERT(bIsConnected);
  590. if (bIsConnected == false) return false;
  591. m_pIAttemperEngineSink->OnEventTCPNetworkRead(Command, pData, wDataSize, dwSocketID);
  592. }
  593. catch (...) { return false; }
  594. return true;
  595. }
  596. //////////////////////////////////////////////////////////////////////////
  597. //建立对象函数
  598. //
  599. extern "C" __declspec(dllexport) void * CreateAttemperEngine(const GUID & Guid, DWORD dwInterfaceVer)
  600. {
  601. //建立对象
  602. CAttemperEngine * pAttemperEngine = NULL;
  603. try
  604. {
  605. pAttemperEngine = new CAttemperEngine();
  606. if (pAttemperEngine == NULL) throw TEXT("创建失败");
  607. void * pObject = pAttemperEngine->QueryInterface(Guid, dwInterfaceVer);
  608. if (pObject == NULL) throw TEXT("接口查询失败");
  609. return pObject;
  610. }
  611. catch (...) {}
  612. //清理对象
  613. SafeDelete(pAttemperEngine);
  614. return NULL;
  615. }
  616. //////////////////////////////////////////////////////////////////////////