诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

719 line
21 KiB

  1. #include "StdAfx.h"
  2. #include "TraceService.h"
  3. #include "TCPSocketService.h"
  4. //内核命令码
  5. #define MDM_KN_COMMAND 0 //内核命令
  6. #define SUB_KN_DETECT_SOCKET 1 //检测命令
  7. #define SUB_KN_SHUT_DOWN_SOCKET 2 //中断网络
  8. //宏定义
  9. #define ID_SOCKET_WND 10 //SOCKET 窗口 ID
  10. #define MY_WM_SOCKET_NOTIFY WM_USER+10 //SOCKET 消息
  11. //////////////////////////////////////////////////////////////////////////
  12. BEGIN_MESSAGE_MAP(CTCPSocketService, CWnd)
  13. ON_MESSAGE(MY_WM_SOCKET_NOTIFY, OnSocketNotify)
  14. END_MESSAGE_MAP()
  15. //#define MY_ENCRYPT
  16. //函数定义
  17. //////////////////////////////////////////////////////////////////////////
  18. //构造函数
  19. CTCPSocketService::CTCPSocketService(void)
  20. {
  21. //恢复数据
  22. m_cbSendRound = 0;
  23. m_cbRecvRound = 0;
  24. m_dwSendXorKey = 0;
  25. m_dwRecvXorKey = 0;
  26. m_hSocket = INVALID_SOCKET;
  27. m_dwSendTickCount = 0;
  28. m_dwRecvTickCount = 0;
  29. m_dwSendPacketCount = 0;
  30. m_dwRecvPacketCount = 0;
  31. m_wServiceID = 0;
  32. m_cbSocketStatus = SOCKET_STATUS_IDLE;
  33. m_wRecvSize = 0;
  34. m_dwServerIP = INADDR_NONE;
  35. m_wPort = 0;
  36. m_bSuccess = false;
  37. ZeroMemory(m_szIp,sizeof(TCHAR) * 72);
  38. }
  39. //析构函数
  40. CTCPSocketService::~CTCPSocketService(void)
  41. {
  42. if (m_bService)
  43. ConcludeService();
  44. }
  45. //基础接口
  46. //////////////////////////////////////////////////////////////////////////
  47. //接口查询
  48. void * CTCPSocketService::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  49. {
  50. QUERYINTERFACE(ITCPSocketService, Guid, dwQueryVer);
  51. QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
  52. QUERYINTERFACE_IUNKNOWNEX(ITCPSocketService, Guid, dwQueryVer);
  53. return NULL;
  54. }
  55. //服务接口
  56. //////////////////////////////////////////////////////////////////////////
  57. //启动服务
  58. bool CTCPSocketService::StartService()
  59. {
  60. //效验状态
  61. if (m_bService == true)
  62. {
  63. CTraceService::TraceString(TEXT("网络服务重复启动,启动操作忽略"), TraceLevel_Warning);
  64. return true;
  65. }
  66. //绑定对象
  67. if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  68. {
  69. CTraceService::TraceString(TEXT("网络服务与触发服务绑定失败"), TraceLevel_Exception);
  70. return false;
  71. }
  72. try
  73. {
  74. //绑定对象
  75. if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  76. {
  77. CTraceService::TraceString(TEXT("网络引擎与触发服务绑定失败"), TraceLevel_Exception);
  78. return false;
  79. }
  80. // m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  81. // if (m_hSocket == INVALID_SOCKET) return false;
  82. if ((m_hWnd == NULL) && (!Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), GetDesktopWindow(), ID_SOCKET_WND, NULL)))
  83. return false;
  84. if (m_QueueService.StartService())
  85. {
  86. m_bService = true;
  87. }
  88. }
  89. catch (LPCTSTR pszError)
  90. {
  91. CTraceService::TraceString(pszError, TraceLevel_Exception);
  92. return false;
  93. }
  94. return m_bService;
  95. }
  96. //停止服务
  97. bool CTCPSocketService::ConcludeService()
  98. {
  99. //设置变量
  100. m_bService = false;
  101. CTraceService::TraceString(TEXT("网络引擎 停止服务成功"), TraceLevel_Normal);
  102. if (m_hSocket != INVALID_SOCKET)
  103. {
  104. //LINGER lingerStruct;
  105. //lingerStruct.l_onoff = 1;
  106. //lingerStruct.l_linger = 0;
  107. //setsockopt(m_hSocket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct));
  108. closesocket(m_hSocket);
  109. WSAAsyncSelect(m_hSocket, GetSafeHwnd(), MY_WM_SOCKET_NOTIFY, 0);
  110. m_hSocket = INVALID_SOCKET;
  111. }
  112. //恢复数据
  113. m_cbSendRound = 0;
  114. m_cbRecvRound = 0;
  115. m_dwSendXorKey = 0;
  116. m_dwRecvXorKey = 0;
  117. m_hSocket = INVALID_SOCKET;
  118. m_dwSendTickCount = 0;
  119. m_dwRecvTickCount = 0;
  120. m_dwSendPacketCount = 0;
  121. m_dwRecvPacketCount = 0;
  122. m_cbSocketStatus = SOCKET_STATUS_IDLE;
  123. m_wRecvSize = 0;
  124. m_dwServerIP = INADDR_NONE;
  125. m_wPort = 0;
  126. m_bSuccess = false;
  127. m_MyEncrypt.Reset();
  128. m_QueueServiceEvent.SetQueueServiceSink(NULL);
  129. m_QueueService.ConcludeService();
  130. return true;
  131. }
  132. //配置接口
  133. //////////////////////////////////////////////////////////////////////////
  134. //配置函数
  135. bool CTCPSocketService::SetServiceID(WORD wServiceID)
  136. {
  137. m_wServiceID = wServiceID;
  138. return true;
  139. }
  140. //设置接口
  141. bool CTCPSocketService::SetTCPSocketEvent(IUnknownEx * pIUnknownEx)
  142. {
  143. //状态判断
  144. if (m_bService == true)
  145. {
  146. CTraceService::TraceString(TEXT("网络组件处于服务状态,绑定操作忽略"), TraceLevel_Warning);
  147. return false;
  148. }
  149. //设置接口
  150. if (m_QueueServiceEvent.SetQueueServiceSink(pIUnknownEx) == false)
  151. {
  152. CTraceService::TraceString(TEXT("网络组件与触发服务绑定失败"), TraceLevel_Warning);
  153. return false;
  154. }
  155. return true;
  156. }
  157. //功能接口
  158. //////////////////////////////////////////////////////////////////////////
  159. //关闭连接
  160. bool CTCPSocketService::CloseSocket()
  161. {
  162. //关闭连接
  163. bool bClose = (m_hSocket != INVALID_SOCKET);
  164. if (bClose)
  165. return m_QueueService.AddToQueue(QUEUE_SAFE_CLOSE, NULL, 0);
  166. //恢复数据
  167. m_cbSendRound = 0;
  168. m_cbRecvRound = 0;
  169. m_dwSendXorKey = 0;
  170. m_dwRecvXorKey = 0;
  171. m_hSocket = INVALID_SOCKET;
  172. m_dwSendTickCount = 0;
  173. m_dwRecvTickCount = 0;
  174. m_dwSendPacketCount = 0;
  175. m_dwRecvPacketCount = 0;
  176. m_cbSocketStatus = SOCKET_STATUS_IDLE;
  177. m_wRecvSize = 0;
  178. m_dwServerIP = INADDR_NONE;
  179. m_wPort = 0;
  180. m_MyEncrypt.Reset();
  181. return true;
  182. }
  183. //连接地址
  184. bool CTCPSocketService::Connect(DWORD dwServerIP, WORD wPort)
  185. {
  186. m_wPort = wPort;
  187. m_dwServerIP = dwServerIP;
  188. //设置参数
  189. m_cbSendRound = 0;
  190. m_cbRecvRound = 0;
  191. m_dwSendXorKey = 0x12345678;
  192. m_dwRecvXorKey = 0x12345678;
  193. m_MyEncrypt.Reset();
  194. try
  195. {
  196. return m_QueueService.AddToQueue(QUEUE_CONNECT_REQUEST, NULL, 0);
  197. }
  198. catch (LPCTSTR pszError)
  199. {
  200. CTraceService::TraceString(pszError, TraceLevel_Warning);
  201. CTraceService::TraceString(TEXT("Connect1 "), TraceLevel_Warning);
  202. CloseSocket(SHUT_REASON_EXCEPTION);
  203. throw pszError;
  204. }
  205. catch (...)
  206. {
  207. CTraceService::TraceString(TEXT("Connect2 "), TraceLevel_Warning);
  208. CloseSocket(SHUT_REASON_EXCEPTION);
  209. throw TEXT("连接产生未知异常错误");
  210. }
  211. return false;
  212. }
  213. //连接地址
  214. bool CTCPSocketService::Connect(LPCTSTR szServerIP, WORD wPort)
  215. {
  216. //效验数据
  217. ASSERT(wPort != 0);
  218. ASSERT(szServerIP != NULL);
  219. if ((szServerIP == NULL) || (wPort == 0)) return false;
  220. //CString csIpPort;
  221. //csIpPort.Format(_T("%s:%d"), szServerIP, wPort);
  222. //StringCchCopy(m_szIp, sizeof(TCHAR) * 72, csIpPort.GetBuffer());
  223. //csIpPort.ReleaseBuffer();
  224. return Connect(TranslateAddr(szServerIP), wPort);
  225. }
  226. //发送函数
  227. bool CTCPSocketService::SendData(WORD wMainCmdID, WORD wSubCmdID)
  228. {
  229. //效验状态
  230. if (m_hSocket == INVALID_SOCKET) return false;
  231. if (m_cbSocketStatus != SOCKET_STATUS_CONNECT) return false;
  232. //构造数据
  233. BYTE cbDataBuffer[SOCKET_TCP_BUFFER];
  234. TCP_Head * pHead = (TCP_Head *)cbDataBuffer;
  235. pHead->CommandInfo.wMainCmdID = wMainCmdID;
  236. pHead->CommandInfo.wSubCmdID = wSubCmdID;
  237. //加密数据
  238. WORD wSendSize = EncryptBuffer(cbDataBuffer, sizeof(TCP_Head), sizeof(cbDataBuffer), pHead->TCPInfo.cbDataKind);
  239. //发送数据
  240. return SendDataBuffer(cbDataBuffer, wSendSize);
  241. }
  242. //通知回调
  243. void CTCPSocketService::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
  244. {
  245. switch (wIdentifier)
  246. {
  247. case QUEUE_SEND_REQUEST:
  248. {
  249. ASSERT(pBuffer);
  250. ASSERT(wDataSize > 0);
  251. if (!pBuffer || wDataSize <= 0) return;
  252. //发送数据
  253. WORD wSended = 0;
  254. while (wSended < wDataSize)
  255. {
  256. int iErrorCode = send(m_hSocket, (char *)pBuffer + wSended, wDataSize - wSended, 0);
  257. if (iErrorCode == SOCKET_ERROR)
  258. {
  259. if (WSAGetLastError() == WSAEWOULDBLOCK)
  260. {
  261. return;
  262. }
  263. return;
  264. }
  265. wSended += iErrorCode;
  266. }
  267. break;
  268. }
  269. case QUEUE_CONNECT_REQUEST:
  270. {
  271. //效验状态
  272. if (m_dwServerIP == INADDR_NONE) throw TEXT("目标服务器地址格式不正确,请检查后再次尝试!");
  273. if (m_wPort == 0) throw TEXT("目标服务器地址格式不正确,请检查后再次尝试!");
  274. //建立 SOCKET
  275. m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  276. if (m_hSocket == INVALID_SOCKET) throw TEXT("SOCKET 创建失败");
  277. //效验参数
  278. ASSERT(m_hSocket != INVALID_SOCKET);
  279. ASSERT(m_cbSocketStatus == SOCKET_STATUS_IDLE);
  280. int iErrorCode = WSAAsyncSelect(m_hSocket, m_hWnd, MY_WM_SOCKET_NOTIFY, FD_READ | FD_CONNECT | FD_CLOSE);
  281. if (iErrorCode == SOCKET_ERROR) throw TEXT("绑定内部窗口错误");
  282. //填写服务器地址
  283. SOCKADDR_IN SocketAddr;
  284. memset(&SocketAddr, 0, sizeof(SocketAddr));
  285. SocketAddr.sin_family = AF_INET;
  286. SocketAddr.sin_port = htons(m_wPort);
  287. SocketAddr.sin_addr.S_un.S_addr = (m_dwServerIP);
  288. iErrorCode = connect(m_hSocket, (sockaddr*)& SocketAddr, sizeof(sockaddr));
  289. if (SOCKET_ERROR == iErrorCode)
  290. iErrorCode = WSAGetLastError();
  291. break;
  292. }
  293. case QUEUE_SAFE_CLOSE:
  294. {
  295. if (m_hSocket != INVALID_SOCKET)
  296. {
  297. //closesocket(m_hSocket); ///+++
  298. WSAAsyncSelect(m_hSocket, GetSafeHwnd(), MY_WM_SOCKET_NOTIFY, 0);
  299. closesocket(m_hSocket); ///+++
  300. m_hSocket = INVALID_SOCKET;
  301. }
  302. //恢复数据
  303. m_cbSendRound = 0;
  304. m_cbRecvRound = 0;
  305. m_dwSendXorKey = 0;
  306. m_dwRecvXorKey = 0;
  307. m_hSocket = INVALID_SOCKET;
  308. m_dwSendTickCount = 0;
  309. m_dwRecvTickCount = 0;
  310. m_dwSendPacketCount = 0;
  311. m_dwRecvPacketCount = 0;
  312. m_cbSocketStatus = SOCKET_STATUS_IDLE;
  313. m_wRecvSize = 0;
  314. m_dwServerIP = INADDR_NONE;
  315. m_wPort = 0;
  316. m_MyEncrypt.Reset();
  317. break;
  318. }
  319. case QUEUE_DETECT_SOCKET:
  320. {
  321. }
  322. default:
  323. {
  324. ASSERT(FALSE);
  325. return;
  326. }
  327. }
  328. }
  329. //发送函数
  330. bool CTCPSocketService::SendData(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  331. {
  332. //效验状态
  333. if (m_hSocket == INVALID_SOCKET) return false;
  334. // if (m_cbSocketStatus != SOCKET_STATUS_CONNECT) return false;
  335. //效验大小
  336. ASSERT(wDataSize <= SOCKET_TCP_BUFFER);
  337. if (wDataSize > SOCKET_TCP_BUFFER) return false;
  338. //构造数据
  339. BYTE cbDataBuffer[SOCKET_TCP_BUFFER];
  340. TCP_Head * pHead = (TCP_Head *)cbDataBuffer;
  341. pHead->CommandInfo.wMainCmdID = wMainCmdID;
  342. pHead->CommandInfo.wSubCmdID = wSubCmdID;
  343. if (wDataSize > 0)
  344. {
  345. ASSERT(pData != NULL);
  346. CopyMemory(pHead + 1, pData, wDataSize);
  347. }
  348. //加密数据
  349. WORD wSendSize = EncryptBuffer(cbDataBuffer, sizeof(TCP_Head) + wDataSize, sizeof(cbDataBuffer), pHead->TCPInfo.cbDataKind);
  350. #ifdef _DEBUG
  351. CString csSend;
  352. CString AppName = _T("GameServer");
  353. CString AppName1 = _T("游戏服务器");
  354. CString csTest = AfxGetAppName();
  355. if (!(wSubCmdID == SUB_KN_DETECT_SOCKET && wMainCmdID == MDM_KN_COMMAND)
  356. && !(wMainCmdID == 5 && wSubCmdID == 3)
  357. && !(wMainCmdID == 2 && wSubCmdID == 1 && (AppName1 == csTest || AppName == csTest)))
  358. {
  359. csSend.Format(_T("【服务器间通讯】进程【%s】【发送】 -> %s 主命令码【%d】 子命令码【%d】\n\r"), AfxGetAppName(), m_szIp, wMainCmdID, wSubCmdID);
  360. //OutputDebugString(csSend);
  361. }
  362. #endif
  363. //发送数据
  364. return SendDataBuffer(cbDataBuffer, wSendSize);
  365. }
  366. //发送数据
  367. bool CTCPSocketService::SendDataBuffer(void * pBuffer, WORD wSendSize)
  368. {
  369. //效验参数
  370. ASSERT(wSendSize != 0);
  371. ASSERT(pBuffer != NULL);
  372. if (NULL == pBuffer || 0 == wSendSize) return false;
  373. if (!m_bService){
  374. return true;
  375. }
  376. return m_QueueService.AddToQueue(QUEUE_SEND_REQUEST, pBuffer, wSendSize);
  377. }
  378. //关闭连接
  379. VOID CTCPSocketService::CloseSocket(BYTE cbShutReason)
  380. {
  381. //关闭连接
  382. if (m_bService){
  383. m_QueueServiceEvent.PostTCPSocketCloseEvent(m_wServiceID, cbShutReason);
  384. }
  385. CloseSocket();
  386. }
  387. //解释服务器地址
  388. DWORD CTCPSocketService::TranslateAddr(LPCTSTR pszServerAddr)
  389. {
  390. USES_CONVERSION;;
  391. char * pServerAddr = W2A(pszServerAddr);
  392. //转化地址
  393. DWORD dwServerIP = inet_addr(pServerAddr);
  394. if (dwServerIP == INADDR_NONE)
  395. {
  396. LPHOSTENT lpHost = gethostbyname(pServerAddr);
  397. if (lpHost == NULL) return INADDR_NONE;
  398. dwServerIP = ((LPIN_ADDR)lpHost->h_addr)->s_addr;
  399. }
  400. return dwServerIP;
  401. }
  402. //加密数据
  403. WORD CTCPSocketService::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize, BYTE cbDataKind)
  404. {
  405. int i = 0;
  406. //效验参数
  407. ASSERT(wDataSize >= sizeof(TCP_Head));
  408. ASSERT(wBufferSize >= (wDataSize + 2 * sizeof(DWORD)));
  409. ASSERT(wDataSize <= (sizeof(TCP_Head)+SOCKET_TCP_BUFFER));
  410. //填写信息头
  411. TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
  412. pHead->TCPInfo.wPacketSize = wDataSize;
  413. pHead->TCPInfo.cbDataKind = DK_MAPPED_NEW;
  414. #ifdef MY_ENCRYPT
  415. BYTE checkCode = 0;
  416. for (WORD i = sizeof(TCP_Info); i < wDataSize; i++)
  417. {
  418. checkCode += pcbDataBuffer[i];
  419. pcbDataBuffer[i] = MapSendByteEx(pcbDataBuffer[i]);
  420. }
  421. pHead->TCPInfo.cbCheckCode = ~checkCode + 1;
  422. //设置变量
  423. m_dwSendPacketCount++;
  424. #else
  425. m_MyEncrypt.EncryptBuffer(pcbDataBuffer + 4, wDataSize - 4);
  426. #endif
  427. return wDataSize;
  428. }
  429. //解密数据
  430. WORD CTCPSocketService::CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize)
  431. {
  432. //效验参数
  433. //ASSERT(m_dwSendPacketCount > 0);
  434. ASSERT(wDataSize >= sizeof(TCP_Head));
  435. ASSERT(((TCP_Head *)pcbDataBuffer)->TCPInfo.wPacketSize == wDataSize);
  436. #ifdef MY_ENCRYPT
  437. //效验码与字节映射
  438. TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
  439. for (int i = sizeof(TCP_Info); i < wDataSize; i++)
  440. {
  441. pcbDataBuffer[i] = MapRecvByteEx(pcbDataBuffer[i]);
  442. }
  443. #else
  444. m_MyEncrypt.DecryptBuffer(pcbDataBuffer + 4, wDataSize - 4);
  445. #endif
  446. return wDataSize;
  447. }
  448. //随机映射
  449. WORD CTCPSocketService::SeedRandMap(WORD wSeed)
  450. {
  451. DWORD dwHold = wSeed;
  452. return (WORD)((dwHold = dwHold * 241103L + 2533101L) >> 16);
  453. }
  454. //映射发送数据
  455. BYTE CTCPSocketService::MapSendByte(BYTE const cbData)
  456. {
  457. BYTE cbMap;
  458. cbMap = g_SendByteMap[cbData];
  459. return cbMap;
  460. }
  461. //映射接收数据
  462. BYTE CTCPSocketService::MapRecvByte(BYTE const cbData)
  463. {
  464. BYTE cbMap;
  465. cbMap = g_RecvByteMap[cbData];
  466. return cbMap;
  467. }
  468. //映射发送数据
  469. BYTE CTCPSocketService::MapSendByteEx(BYTE const cbData)
  470. {
  471. BYTE cbMap;
  472. cbMap = g_SendByteMapNew[cbData];
  473. return cbMap;
  474. }
  475. //映射接收数据
  476. BYTE CTCPSocketService::MapRecvByteEx(BYTE const cbData)
  477. {
  478. BYTE cbMap;
  479. cbMap = g_RecvByteMapNew[cbData];
  480. return cbMap;
  481. }
  482. //网络连接
  483. LRESULT CTCPSocketService::OnSocketNotifyConnect(WPARAM wParam, LPARAM lParam)
  484. {
  485. //判断状态
  486. int iErrorCode = WSAGETSELECTERROR(lParam);
  487. if (iErrorCode == 0)
  488. {
  489. m_cbSocketStatus = SOCKET_STATUS_CONNECT;
  490. m_bSuccess = true;
  491. //发送通知
  492. m_QueueServiceEvent.PostTCPSocketConnectedEvent(m_wServiceID, iErrorCode);
  493. }
  494. else CloseSocket(SHUT_REASON_TIME_OUT);
  495. return 1;
  496. }
  497. //网络读取
  498. LRESULT CTCPSocketService::OnSocketNotifyRead(WPARAM wParam, LPARAM lParam)
  499. {
  500. try
  501. {
  502. //读取数据
  503. int iRetCode = recv(m_hSocket, (char *)m_cbRecvBuf + m_wRecvSize, sizeof(m_cbRecvBuf)-m_wRecvSize, 0);
  504. if (iRetCode == SOCKET_ERROR)
  505. {
  506. throw TEXT("网络连接关闭,读取数据失败");
  507. }
  508. ASSERT(m_dwSendPacketCount > 0);
  509. m_wRecvSize += iRetCode;
  510. m_dwRecvTickCount = GetTickCount() / 1000L;
  511. //变量定义
  512. WORD wPacketSize = 0;
  513. BYTE cbDataBuffer[SOCKET_TCP_BUFFER + sizeof(TCP_Head)];
  514. TCP_Head * pHead = (TCP_Head *)m_cbRecvBuf;
  515. int nCount = 0;
  516. while (m_wRecvSize >= sizeof(TCP_Head))
  517. {
  518. //效验参数
  519. wPacketSize = pHead->TCPInfo.wPacketSize;
  520. if (wPacketSize > (SOCKET_TCP_BUFFER + sizeof(TCP_Head)))
  521. {
  522. ZeroMemory(m_cbRecvBuf, m_wRecvSize);
  523. m_wRecvSize = 0;
  524. //throw TEXT("数据包太大");
  525. CTraceService::TraceString(TEXT("数据包太大,丢弃乱包数据重新接收"), TraceLevel_Warning);
  526. }
  527. if (m_wRecvSize < wPacketSize) return 1;
  528. //拷贝数据
  529. m_dwRecvPacketCount++;
  530. CopyMemory(cbDataBuffer, m_cbRecvBuf, wPacketSize);
  531. m_wRecvSize -= wPacketSize;
  532. MoveMemory(m_cbRecvBuf, m_cbRecvBuf + wPacketSize, m_wRecvSize);
  533. //解密数据
  534. WORD wRealySize = CrevasseBuffer(cbDataBuffer, wPacketSize);
  535. ASSERT(wRealySize >= sizeof(TCP_Head));
  536. //解释数据
  537. WORD wDataSize = wRealySize - sizeof(TCP_Head);
  538. void * pDataBuffer = cbDataBuffer + sizeof(TCP_Head);
  539. TCP_Command Command = ((TCP_Head *)cbDataBuffer)->CommandInfo;
  540. //内核命令
  541. if (Command.wMainCmdID == MDM_KN_COMMAND)
  542. {
  543. switch (Command.wSubCmdID)
  544. {
  545. case SUB_KN_DETECT_SOCKET: //网络检测
  546. {
  547. //发送数据
  548. SendData(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, pDataBuffer, wDataSize);
  549. break;
  550. }
  551. default:
  552. break;
  553. }
  554. continue;
  555. }
  556. //处理数据
  557. const bool bSuccess = m_QueueServiceEvent.PostTCPSocketReadEvent(m_wServiceID, Command, pDataBuffer, wDataSize);
  558. if (bSuccess == false)
  559. {
  560. CString csTestB;
  561. csTestB.Format(_T("636行 读取事件 响应失败 ->(MainCmdID:wSubCmdID):(%d:%d),wDataSize=%d"), Command.wMainCmdID, Command.wSubCmdID, wDataSize);
  562. CTraceService::TraceString(csTestB, TraceLevel_Warning);
  563. throw TEXT("网络数据包处理失败");
  564. }
  565. };
  566. }
  567. catch (LPCTSTR pszError)
  568. {
  569. CTraceService::TraceString(pszError, TraceLevel_Warning);
  570. CloseSocket(SHUT_REASON_EXCEPTION);
  571. }
  572. return 1;
  573. }
  574. //网络关闭
  575. LRESULT CTCPSocketService::OnSocketNotifyClose(WPARAM wParam, LPARAM lParam)
  576. {
  577. CloseSocket(SHUT_REASON_REMOTE);
  578. return 1;
  579. }
  580. //SOCKET 消息处理程序
  581. LRESULT CTCPSocketService::OnSocketNotify(WPARAM wParam, LPARAM lParam)
  582. {
  583. switch (WSAGETSELECTEVENT(lParam))
  584. {
  585. case FD_CONNECT: //网络连接
  586. {
  587. return OnSocketNotifyConnect(wParam, lParam);
  588. }
  589. case FD_READ: //数据读取
  590. {
  591. return OnSocketNotifyRead(wParam, lParam);
  592. }
  593. case FD_CLOSE: //网络关闭
  594. {
  595. return OnSocketNotifyClose(wParam, lParam);
  596. }
  597. }
  598. return 0;
  599. }
  600. //////////////////////////////////////////////////////////////////////////
  601. //建立对象函数
  602. extern "C" __declspec(dllexport) void * CreateTCPSocketService(const GUID & Guid, DWORD dwInterfaceVer)
  603. {
  604. //建立对象
  605. CTCPSocketService * pTCPSocketService = NULL;
  606. try
  607. {
  608. pTCPSocketService = new CTCPSocketService();
  609. if (pTCPSocketService == NULL) throw TEXT("创建失败");
  610. void * pObject = pTCPSocketService->QueryInterface(Guid, dwInterfaceVer);
  611. if (pObject == NULL) throw TEXT("接口查询失败");
  612. return pObject;
  613. }
  614. catch (...) {}
  615. //清理对象
  616. SafeDelete(pTCPSocketService);
  617. return NULL;
  618. }