诸暨麻将添加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.
 
 
 
 
 
 

1962 lines
60 KiB

  1. #include "StdAfx.h"
  2. #include "TraceService.h" //
  3. #include "TCPNetworkEngine.h"
  4. #include "../../MessageDef/Pb_Socket.pb.h"
  5. //////////////////////////////////////////////////////////////////////////
  6. //宏定义
  7. #define TIME_BREAK_READY 9000L //中断时间
  8. #define TIME_BREAK_CONNECT 4000L //中断时间
  9. #define TIME_DETECT_SOCKET 20000L //监测时间
  10. //////////////////////////////////////////////////////////////////////////
  11. //动作定义
  12. #define QUEUE_SEND_REQUEST 1 //发送标识
  13. #define QUEUE_SAFE_CLOSE 2 //安全关闭
  14. #define QUEUE_ALLOW_BATCH 3 //允许群发
  15. #define QUEUE_DETECT_SOCKET 4 //检测连接
  16. //#define MY_ENCRYPT
  17. //发送请求结构
  18. struct tagSendDataRequest
  19. {
  20. WORD wMainCmdID; //主命令码
  21. WORD wSubCmdID; //子命令码
  22. DWORD dwSocketID; //连接索引
  23. WORD wDataSize; //数据大小
  24. BYTE cbSendBuf[SOCKET_TCP_BUFFER]; //发送缓冲
  25. };
  26. //设置群发
  27. struct tagAllowBatchSend
  28. {
  29. DWORD dwSocketID; //连接索引
  30. BYTE cbAllow; //允许标志
  31. BYTE cbMask;
  32. };
  33. //安全关闭
  34. struct tagSafeCloseSocket
  35. {
  36. DWORD dwSocketID; //连接索引
  37. };
  38. //////////////////////////////////////////////////////////////////////////
  39. //构造函数
  40. COverLapped::COverLapped(enOperationType OperationType) : m_OperationType(OperationType)
  41. {
  42. memset(&m_WSABuffer, 0, sizeof(m_WSABuffer));
  43. memset(&m_OverLapped, 0, sizeof(m_OverLapped));
  44. }
  45. //析构函数
  46. COverLapped::~COverLapped()
  47. {
  48. }
  49. //////////////////////////////////////////////////////////////////////////
  50. //构造函数
  51. COverLappedSend::COverLappedSend() : COverLapped(OperationType_Send)
  52. {
  53. m_WSABuffer.len = 0;
  54. m_WSABuffer.buf = (char *)m_cbBuffer;
  55. }
  56. //析构函数
  57. COverLappedSend::~COverLappedSend()
  58. {
  59. }
  60. //////////////////////////////////////////////////////////////////////////
  61. //构造函数
  62. CServerSocketItem::CServerSocketItem(WORD wIndex, IServerSocketItemSink * pIServerSocketItemSink)
  63. : m_wIndex(wIndex), m_pIServerSocketItemSink(pIServerSocketItemSink)
  64. {
  65. m_wRountID = 1;
  66. m_wRecvSize = 0;
  67. m_cbSendRound = 0;
  68. m_cbRecvRound = 0;
  69. m_bNotify = true;
  70. m_bRecvIng = false;
  71. m_bCloseIng = false;
  72. m_bAllowBatch = true;
  73. m_bForeground = true;//websocket新增,……………………
  74. m_cbSendMask = 0xff;
  75. m_dwSendXorKey = 0;
  76. m_dwRecvXorKey = 0;
  77. m_dwClientAddr = 0;
  78. m_dwConnectTime = 0;
  79. m_dwSendTickCount = 0;
  80. m_dwRecvTickCount = 0;
  81. m_dwSendPacketCount = 0;
  82. m_dwRecvPacketCount = 0;
  83. m_dwPort = 0;
  84. m_hSocket = INVALID_SOCKET;
  85. ZeroMemory(m_szIp, sizeof(TCHAR) * 72);
  86. m_connectType = CHECKING;//websocket新增,……………………
  87. }
  88. //析够函数
  89. CServerSocketItem::~CServerSocketItem(void)
  90. {
  91. //删除空闲重叠 IO
  92. INT_PTR iCount = m_OverLappedSendFree.GetCount();
  93. for (INT_PTR i = 0; i < iCount; i++) delete m_OverLappedSendFree[i];
  94. m_OverLappedSendFree.RemoveAll();
  95. //删除活动重叠 IO
  96. iCount = m_OverLappedSendActive.GetCount();
  97. for (INT_PTR i = 0; i < iCount; i++) delete m_OverLappedSendActive[i];
  98. m_OverLappedSendActive.RemoveAll();
  99. return;
  100. }
  101. //随机映射
  102. WORD CServerSocketItem::SeedRandMap(WORD wSeed)
  103. {
  104. DWORD dwHold = wSeed;
  105. return (WORD)((dwHold = dwHold * 241103L + 2533101L) >> 16);
  106. }
  107. //映射发送数据
  108. BYTE CServerSocketItem::MapSendByte(BYTE const cbData)
  109. {
  110. BYTE cbMap;
  111. cbMap = g_SendByteMap[cbData];
  112. return cbMap;
  113. }
  114. //映射发送数据
  115. BYTE CServerSocketItem::MapSendByteEx(BYTE const cbData)
  116. {
  117. BYTE cbMap;
  118. cbMap = g_SendByteMapNew[cbData];
  119. return cbMap;
  120. }
  121. //映射接收数据
  122. BYTE CServerSocketItem::MapRecvByte(BYTE const cbData)
  123. {
  124. BYTE cbMap;
  125. cbMap = g_RecvByteMap[cbData];
  126. return cbMap;
  127. }
  128. //映射接收数据
  129. BYTE CServerSocketItem::MapRecvByteEx(BYTE const cbData)
  130. {
  131. BYTE cbMap;
  132. cbMap = g_RecvByteMapNew[cbData];
  133. return cbMap;
  134. }
  135. //获取发送结构
  136. COverLappedSend * CServerSocketItem::GetSendOverLapped()
  137. {
  138. //寻找空闲结构
  139. COverLappedSend * pOverLappedSend = NULL;
  140. INT_PTR nFreeCount = m_OverLappedSendFree.GetCount();
  141. if (nFreeCount > 0)
  142. {
  143. pOverLappedSend = m_OverLappedSendFree[nFreeCount - 1];
  144. ASSERT(pOverLappedSend != NULL);
  145. m_OverLappedSendFree.RemoveAt(nFreeCount - 1);
  146. m_OverLappedSendActive.Add(pOverLappedSend);
  147. return pOverLappedSend;
  148. }
  149. //新建发送结构
  150. try
  151. {
  152. pOverLappedSend = new COverLappedSend;
  153. ASSERT(pOverLappedSend != NULL);
  154. m_OverLappedSendActive.Add(pOverLappedSend);
  155. return pOverLappedSend;
  156. }
  157. catch (...) {}
  158. return NULL;
  159. }
  160. //绑定对象
  161. DWORD CServerSocketItem::Attach(SOCKET hSocket, DWORD dwClientAddr, DWORD dwPort)
  162. {
  163. //效验数据
  164. ASSERT(dwClientAddr != 0);
  165. ASSERT(m_bRecvIng == false);
  166. ASSERT(IsValidSocket() == false);
  167. ASSERT(hSocket != INVALID_SOCKET);
  168. //设置变量
  169. m_bNotify = false;
  170. m_bRecvIng = false;
  171. m_bCloseIng = false;
  172. m_bForeground = true;//websocket新增,……………………
  173. m_hSocket = hSocket;
  174. m_dwClientAddr = dwClientAddr;
  175. m_dwRecvTickCount = GetTickCount();
  176. m_dwConnectTime = (DWORD)time(NULL);
  177. //m_dwPort = dwPort;
  178. //CString strIP = _T("");
  179. //WORD add1, add2, add3, add4;
  180. //add1 = (WORD)(dwClientAddr & 255);
  181. //add2 = (WORD)((dwClientAddr >> 8) & 255);
  182. //add3 = (WORD)((dwClientAddr >> 16) & 255);
  183. //add4 = (WORD)((dwClientAddr >> 24) & 255);
  184. //strIP.Format(_T("%d.%d.%d.%d"), add1, add2, add3, add4);
  185. //CString csIpPort;
  186. //csIpPort.Format(_T("%s:%d"), strIP, htons(dwPort));
  187. //StringCchCopy(m_szIp, sizeof(TCHAR) * 72, csIpPort.GetBuffer());
  188. //发送通知
  189. m_pIServerSocketItemSink->OnSocketAcceptEvent(this);
  190. return GetSocketID();
  191. }
  192. //发送函数
  193. bool CServerSocketItem::SendData(WORD wMainCmdID, WORD wSubCmdID, WORD wRountID)
  194. {
  195. //效验状态
  196. if (m_bCloseIng == true) return false;
  197. if (m_wRountID != wRountID) return false;
  198. if (m_dwRecvPacketCount == 0) return false;
  199. if (IsValidSocket() == false) return false;
  200. //寻找发送结构
  201. COverLappedSend * pOverLappedSend = GetSendOverLapped();
  202. ASSERT(pOverLappedSend != NULL);
  203. if (pOverLappedSend == NULL) return false;
  204. //构造数据
  205. TCP_Head * pHead = (TCP_Head *)pOverLappedSend->m_cbBuffer;
  206. pHead->CommandInfo.wMainCmdID = wMainCmdID;
  207. pHead->CommandInfo.wSubCmdID = wSubCmdID;
  208. WORD wSendSize = EncryptBuffer(pOverLappedSend->m_cbBuffer, sizeof(TCP_Head), sizeof(pOverLappedSend->m_cbBuffer), pHead->TCPInfo.cbDataKind);
  209. pOverLappedSend->m_WSABuffer.len = wSendSize;
  210. //发送数据
  211. if (m_OverLappedSendActive.GetCount() == 1)
  212. {
  213. DWORD dwThancferred = 0;
  214. int iRetCode = WSASend(m_hSocket, &pOverLappedSend->m_WSABuffer, 1, &dwThancferred, 0, &pOverLappedSend->m_OverLapped, NULL);
  215. if ((iRetCode == SOCKET_ERROR) && (WSAGetLastError() != WSA_IO_PENDING))
  216. {
  217. OnSendCompleted(pOverLappedSend, 0L);
  218. return false;
  219. }
  220. }
  221. return true;
  222. }
  223. //发送函数
  224. bool CServerSocketItem::SendData(void * pData, WORD wDataSize, WORD wMainCmdID, WORD wSubCmdID, WORD wRountID)
  225. {
  226. //效验参数
  227. ASSERT(wDataSize <= SOCKET_TCP_BUFFER);
  228. //效验状态
  229. if (m_bCloseIng == true) return false;
  230. if (m_wRountID != wRountID) return false;
  231. if (m_dwRecvPacketCount == 0) return false;
  232. if (IsValidSocket() == false) return false;
  233. if (wDataSize > SOCKET_TCP_BUFFER) return false;
  234. //寻找发送结构
  235. COverLappedSend * pOverLappedSend = GetSendOverLapped();
  236. ASSERT(pOverLappedSend != NULL);
  237. if (pOverLappedSend == NULL) return false;
  238. //构造数据
  239. TCP_Head * pHead = (TCP_Head *)pOverLappedSend->m_cbBuffer;
  240. pHead->CommandInfo.wMainCmdID = wMainCmdID;
  241. pHead->CommandInfo.wSubCmdID = wSubCmdID;
  242. if (wDataSize > 0)
  243. {
  244. ASSERT(pData != NULL);
  245. memcpy(pHead + 1, pData, wDataSize);
  246. }
  247. WORD wSendSize = EncryptBuffer(pOverLappedSend->m_cbBuffer, sizeof(TCP_Head) + wDataSize, sizeof(pOverLappedSend->m_cbBuffer), pHead->TCPInfo.cbDataKind);
  248. pOverLappedSend->m_WSABuffer.len = wSendSize;
  249. //发送数据
  250. if (m_OverLappedSendActive.GetCount() == 1)
  251. {
  252. DWORD dwThancferred = 0;
  253. int iRetCode = WSASend(m_hSocket, &pOverLappedSend->m_WSABuffer, 1, &dwThancferred, 0, &pOverLappedSend->m_OverLapped, NULL);
  254. if ((iRetCode == SOCKET_ERROR) && (WSAGetLastError() != WSA_IO_PENDING))
  255. {
  256. OnSendCompleted(pOverLappedSend, 0L);
  257. return false;
  258. }
  259. }
  260. return true;
  261. }
  262. //投递接收
  263. bool CServerSocketItem::RecvData()
  264. {
  265. //效验变量
  266. ASSERT(m_bRecvIng == false);
  267. ASSERT(m_hSocket != INVALID_SOCKET);
  268. //判断关闭
  269. if (m_bCloseIng == true)
  270. {
  271. if (m_OverLappedSendActive.GetCount() == 0) CloseSocket(m_wRountID);
  272. return false;
  273. }
  274. //接收数据
  275. m_bRecvIng = true;
  276. DWORD dwThancferred = 0, dwFlags = 0;
  277. int iRetCode = WSARecv(m_hSocket, &m_OverLappedRecv.m_WSABuffer, 1, &dwThancferred, &dwFlags, &m_OverLappedRecv.m_OverLapped, NULL);
  278. if ((iRetCode == SOCKET_ERROR) && (WSAGetLastError() != WSA_IO_PENDING))
  279. {
  280. m_bRecvIng = false;
  281. CloseSocket(m_wRountID);
  282. return false;
  283. }
  284. return true;
  285. }
  286. //关闭连接
  287. bool CServerSocketItem::CloseSocket(WORD wRountID)
  288. {
  289. //状态判断
  290. if (m_wRountID != wRountID) return false;
  291. //关闭连接
  292. if (m_hSocket != INVALID_SOCKET)
  293. {
  294. closesocket(m_hSocket);
  295. m_hSocket = INVALID_SOCKET;
  296. }
  297. //判断关闭
  298. if ((m_bRecvIng == false) && (m_OverLappedSendActive.GetCount() == 0)) OnCloseCompleted();
  299. return true;
  300. }
  301. //设置关闭
  302. bool CServerSocketItem::ShutDownSocket(WORD wRountID)
  303. {
  304. return true;
  305. //状态判断
  306. if (m_wRountID != wRountID) return false;
  307. if (m_hSocket == INVALID_SOCKET) return false;
  308. //设置变量
  309. if (m_bCloseIng == false)
  310. {
  311. m_bCloseIng = true;
  312. //if (m_OverLappedSendActive.GetCount() == 0) CloseSocket(wRountID);
  313. }
  314. return true;
  315. }
  316. //允许群发
  317. bool CServerSocketItem::AllowBatchSend(WORD wRountID, bool bAllowBatch, BYTE cbBatchMask)
  318. {
  319. //状态判断
  320. if (m_wRountID != wRountID) return false;
  321. if (m_hSocket == INVALID_SOCKET) return false;
  322. //设置变量
  323. m_bAllowBatch = bAllowBatch;
  324. m_cbSendMask = cbBatchMask;
  325. return true;
  326. }
  327. //重置变量
  328. void CServerSocketItem::ResetSocketData()
  329. {
  330. //效验状态
  331. ASSERT(m_hSocket == INVALID_SOCKET);
  332. //重置数据
  333. m_wRountID++;
  334. m_wRecvSize = 0;
  335. m_cbSendRound = 0;
  336. m_cbRecvRound = 0;
  337. m_dwSendXorKey = 0;
  338. m_dwRecvXorKey = 0;
  339. m_dwClientAddr = 0;
  340. m_dwConnectTime = 0;
  341. m_dwSendTickCount = 0;
  342. m_dwRecvTickCount = 0;
  343. m_dwSendPacketCount = 0;
  344. m_dwRecvPacketCount = 0;
  345. m_MyEncrypt.Reset();
  346. //状态变量
  347. m_bNotify = true;
  348. m_bRecvIng = false;
  349. m_bCloseIng = false;
  350. m_bAllowBatch = true;
  351. m_bForeground = true;//websocket新增,……………………
  352. m_cbSendMask = 0xff;
  353. m_OverLappedSendFree.Append(m_OverLappedSendActive);
  354. m_OverLappedSendActive.RemoveAll();
  355. m_connectType = CHECKING;//websocket新增,……………………
  356. return;
  357. }
  358. //发送完成函数
  359. bool CServerSocketItem::OnSendCompleted(COverLappedSend * pOverLappedSend, DWORD dwThancferred)
  360. {
  361. //效验变量
  362. ASSERT(pOverLappedSend != NULL);
  363. ASSERT(m_OverLappedSendActive.GetCount() > 0);
  364. ASSERT(pOverLappedSend == m_OverLappedSendActive[0]);
  365. //释放发送结构
  366. m_OverLappedSendActive.RemoveAt(0);
  367. m_OverLappedSendFree.Add(pOverLappedSend);
  368. //设置变量
  369. if (dwThancferred != 0) m_dwSendTickCount = GetTickCount();
  370. //判断关闭
  371. if (m_hSocket == INVALID_SOCKET)
  372. {
  373. m_OverLappedSendFree.Append(m_OverLappedSendActive);
  374. m_OverLappedSendActive.RemoveAll();
  375. CloseSocket(m_wRountID);
  376. return true;
  377. }
  378. //继续发送数据
  379. if (m_OverLappedSendActive.GetCount() > 0)
  380. {
  381. DWORD dwThancferred = 0;
  382. pOverLappedSend = m_OverLappedSendActive[0];
  383. ASSERT(pOverLappedSend != NULL);
  384. int iRetCode = WSASend(m_hSocket, &pOverLappedSend->m_WSABuffer, 1, &dwThancferred, 0, &pOverLappedSend->m_OverLapped, NULL);
  385. if ((iRetCode == SOCKET_ERROR) && (WSAGetLastError() != WSA_IO_PENDING))
  386. {
  387. m_OverLappedSendFree.Append(m_OverLappedSendActive);
  388. m_OverLappedSendActive.RemoveAll();
  389. CloseSocket(m_wRountID);
  390. return false;
  391. }
  392. return true;
  393. }
  394. //判断关闭
  395. if (m_bCloseIng == true)
  396. CloseSocket(m_wRountID);
  397. return true;
  398. }
  399. //接收完成函数
  400. bool CServerSocketItem::OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred)
  401. {
  402. //效验数据
  403. ASSERT(m_bRecvIng == true);
  404. //设置变量
  405. m_bRecvIng = false;
  406. m_dwRecvTickCount = GetTickCount();
  407. //判断关闭
  408. if (m_hSocket == INVALID_SOCKET)
  409. {
  410. CloseSocket(m_wRountID);
  411. return true;
  412. }
  413. //接收数据
  414. int iRetCode = recv(m_hSocket, (char *)m_cbRecvBuf + m_wRecvSize, sizeof(m_cbRecvBuf)-m_wRecvSize, 0);
  415. if (iRetCode <= 0)
  416. {
  417. CloseSocket(m_wRountID);
  418. return true;
  419. }
  420. //接收完成
  421. m_wRecvSize += iRetCode;
  422. /*CString strTip1;
  423. strTip1.Format(L"m_connectType值:%d", m_connectType);
  424. CTraceService::TraceString(strTip1, TraceLevel_Normal);*/
  425. //web协议建设 websocket新增
  426. if (m_connectType == CHECKING) {
  427. if (CheckIfWinSocket() == true) {
  428. m_connectType = WINSOCKET;
  429. return RecvData();
  430. }
  431. else {
  432. m_connectType = HANDSHAKING;
  433. }
  434. }
  435. if (m_connectType == HANDSHAKING) {
  436. //try to handshake for websocket
  437. const char kDoubleCRLF[] = "\r\n\r\n";
  438. char* recvChar = (char*)m_cbRecvBuf;
  439. const char* pos = std::search(recvChar, recvChar + m_wRecvSize, kDoubleCRLF, kDoubleCRLF + 4);
  440. if (pos == recvChar + m_wRecvSize) {
  441. std::string data((char*)m_cbRecvBuf, m_wRecvSize);
  442. return RecvData();
  443. }
  444. zl::net::ByteBuffer handshakeBuffer;
  445. handshakeBuffer.write(recvChar, m_wRecvSize);
  446. bool success = handshake(&handshakeBuffer);
  447. if (success == true) {
  448. m_connectType = WEBSOCKET;
  449. m_wRecvSize = 0;
  450. return RecvData();
  451. }
  452. else {
  453. CloseSocket(m_wRountID);
  454. return false;
  455. }
  456. }
  457. if (m_connectType == WEBSOCKET)
  458. {
  459. if (HandleWebsocketRecv() == false)
  460. {
  461. CloseSocket(m_wRountID);
  462. return false;
  463. }
  464. return RecvData();
  465. }
  466. BYTE cbBuffer[SOCKET_TCP_BUFFER];
  467. TCP_Head * pHead = (TCP_Head *)m_cbRecvBuf;
  468. /*CString strTip;
  469. strTip.Format(L"m_connectType值:%d pHead->TCPInfo.cbDataKind协议值:%d ,cbCheckCode值:%d,wPacketSize值:%d", m_connectType, pHead->TCPInfo.cbDataKind, pHead->TCPInfo.cbCheckCode, pHead->TCPInfo.wPacketSize);
  470. CTraceService::TraceString(strTip, TraceLevel_Normal);*/
  471. //处理数据
  472. try
  473. {
  474. while (m_wRecvSize >= sizeof(TCP_Head))
  475. {
  476. //效验数据
  477. WORD wPacketSize = pHead->TCPInfo.wPacketSize;
  478. if (wPacketSize > SOCKET_TCP_BUFFER) throw TEXT("数据包超长");
  479. if (wPacketSize < sizeof(TCP_Head)) throw TEXT("数据包非法");
  480. if (m_wRecvSize < wPacketSize) break;
  481. //提取数据
  482. CopyMemory(cbBuffer, m_cbRecvBuf, wPacketSize);
  483. WORD wRealySize = CrevasseBuffer(cbBuffer, wPacketSize);
  484. ASSERT(wRealySize >= sizeof(TCP_Head));
  485. m_dwRecvPacketCount++;
  486. //解释数据
  487. WORD wDataSize = wRealySize - sizeof(TCP_Head);
  488. void * pDataBuffer = cbBuffer + sizeof(TCP_Head);
  489. TCP_Command Command = ((TCP_Head *)cbBuffer)->CommandInfo;
  490. //内核命令
  491. if (Command.wMainCmdID == MDM_KN_COMMAND)
  492. {
  493. switch (Command.wSubCmdID)
  494. {
  495. case SUB_KN_DETECT_SOCKET: //网络检测
  496. {
  497. break;
  498. }
  499. //default:
  500. //{
  501. //throw TEXT("非法命令码");
  502. //}
  503. }
  504. }
  505. else
  506. {
  507. //消息处理
  508. m_pIServerSocketItemSink->OnSocketReadEvent(Command, pDataBuffer, wDataSize, this);
  509. }
  510. //删除缓存数据
  511. m_wRecvSize -= wPacketSize;
  512. MoveMemory(m_cbRecvBuf, m_cbRecvBuf + wPacketSize, m_wRecvSize);
  513. }
  514. }
  515. catch (...)
  516. {
  517. CloseSocket(m_wRountID);
  518. return false;
  519. }
  520. return RecvData();
  521. }
  522. //--websocket新增
  523. bool CServerSocketItem::CheckIfWinSocket() {
  524. BYTE cbBuffer[SOCKET_TCP_BUFFER];
  525. TCP_Head * pHead = (TCP_Head *)m_cbRecvBuf;
  526. //处理数据
  527. try {
  528. while (m_wRecvSize >= sizeof(TCP_Head)) {
  529. //效验数据
  530. WORD wPacketSize = pHead->TCPInfo.wPacketSize;
  531. if (wPacketSize > SOCKET_TCP_BUFFER) {
  532. throw TEXT("数据包超长");
  533. }
  534. if (wPacketSize < sizeof(TCP_Head)) {
  535. throw TEXT("数据包非法");
  536. }
  537. //if (pHead->TCPInfo.cbVersion != SOCKET_TCP_VER) throw TEXT("数据包版本错误");
  538. /*if (pHead->TCPInfo.cbDataKind != SOCKET_TCP_VER) {
  539. throw TEXT("数据包版本错误");
  540. }*/
  541. if (m_wRecvSize < wPacketSize) {
  542. break;
  543. }
  544. //提取数据
  545. CopyMemory(cbBuffer, m_cbRecvBuf, wPacketSize);
  546. WORD wRealySize = CrevasseBuffer(cbBuffer, wPacketSize);
  547. ASSERT(wRealySize >= sizeof(TCP_Head));
  548. m_dwRecvPacketCount++;
  549. //解释数据
  550. WORD wDataSize = wRealySize - sizeof(TCP_Head);
  551. void * pDataBuffer = cbBuffer + sizeof(TCP_Head);
  552. TCP_Command Command = ((TCP_Head *)cbBuffer)->CommandInfo;
  553. //内核命令
  554. if (Command.wMainCmdID == MDM_KN_COMMAND) {
  555. switch (Command.wSubCmdID) {
  556. case SUB_KN_DETECT_SOCKET: { //网络检测
  557. break;
  558. }
  559. default: {
  560. throw TEXT("非法命令码");
  561. }
  562. }
  563. }
  564. else {
  565. //消息处理
  566. m_pIServerSocketItemSink->OnSocketReadEvent(Command, pDataBuffer, wDataSize, this);
  567. }
  568. //删除缓存数据
  569. m_wRecvSize -= wPacketSize;
  570. MoveMemory(m_cbRecvBuf, m_cbRecvBuf + wPacketSize, m_wRecvSize);
  571. }
  572. }
  573. catch (...) {
  574. return false;
  575. }
  576. return true;
  577. }
  578. bool CServerSocketItem::handshake(zl::net::ByteBuffer* byteBuffer)
  579. {
  580. zl::net::HttpContext context;
  581. if (!context.parseRequest(byteBuffer) || context.request().method() != zl::net::HttpGet) { // 解析失败 或者 不是Get请求
  582. //LOG_WARN(_T("parse handshake error,send close header"));
  583. std::string msg = "HTTP/1.1 400 Bad Request\r\n\r\n";
  584. SendRawData(msg.c_str(), msg.size());
  585. return false;
  586. }
  587. assert(context.gotAll());
  588. zl::net::HttpRequest& req = context.request();
  589. std::string query = req.query();
  590. if (query.empty() == false) {
  591. query = query.substr(1);
  592. }
  593. std::string key = req.getHeader(zl::net::ws::kSecWebSocketKeyHeader);
  594. std::string ip = req.getHeader("X-Forwarded-For");
  595. if (ip.empty() == false) {
  596. //LOG_PRINT("real ip",ip.c_str());
  597. m_dwClientAddr = inet_addr(ip.c_str());
  598. //Attach(m_hSocket, inet_addr(ip.c_str()));
  599. m_pIServerSocketItemSink->OnSocketAcceptEvent(this);
  600. }
  601. std::string answer = zl::net::ws::makeHandshakeResponse(key.c_str(), req.getHeader(zl::net::ws::kSecWebSocketProtocolHeader));
  602. //printf ("response handshake:\n %s\n", answer.c_str());
  603. SendRawData(answer.c_str(), answer.size());
  604. return true;
  605. }
  606. bool CServerSocketItem::SendRawData(const char* data, int len) {
  607. //寻找发送结构
  608. COverLappedSend * pOverLappedSend = GetSendOverLapped();
  609. ASSERT(pOverLappedSend != NULL);
  610. if (pOverLappedSend == NULL) {
  611. return false;
  612. }
  613. int n = 0;
  614. for (int i = 0; i < len; i++) {
  615. pOverLappedSend->m_cbBuffer[i] = data[i];
  616. n++;
  617. }
  618. pOverLappedSend->m_cbBuffer[n] = 0;
  619. pOverLappedSend->m_WSABuffer.len = len;
  620. //发送数据
  621. if (m_OverLappedSendActive.GetCount() == 1) {
  622. DWORD dwThancferred = 0;
  623. int iRetCode = WSASend(m_hSocket, &pOverLappedSend->m_WSABuffer, 1, &dwThancferred, 0, &pOverLappedSend->m_OverLapped, NULL);
  624. if ((iRetCode == SOCKET_ERROR) && (WSAGetLastError() != WSA_IO_PENDING)) {
  625. OnSendCompleted(pOverLappedSend, 0L);
  626. return false;
  627. }
  628. }
  629. return true;
  630. }
  631. bool CServerSocketItem::HandleWebsocketRecv() {
  632. using namespace zl::net::ws;
  633. if (m_wRecvSize > SOCKET_TCP_BUFFER) {
  634. //CloseSocket(m_wRountID);
  635. //LOG_WARN(_T("error,receive data len > SOCKET_TCP_BUFFER,%d>32768"), (int)m_wRecvSize);
  636. return false;
  637. }
  638. try {
  639. while (m_wRecvSize > 0) {
  640. char outbuf[SOCKET_TCP_BUFFER];
  641. int outlen = 0;
  642. int frameSize = 0;
  643. WsFrameType type = decodeFrame((char*)m_cbRecvBuf, m_wRecvSize, outbuf, &outlen, &frameSize);
  644. switch (type) {
  645. case WS_INCOMPLETE_TEXT_FRAME:
  646. case WS_INCOMPLETE_BINARY_FRAME:
  647. case WS_INCOMPLETE_FRAME: {
  648. return true;
  649. }
  650. case WS_TEXT_FRAME:
  651. case WS_BINARY_FRAME: {
  652. m_dwRecvPacketCount++;
  653. CString strTip1;
  654. strTip1.Format(L"m_dwRecvPacketCount值:%d", m_dwRecvPacketCount);
  655. CTraceService::TraceString(strTip1, TraceLevel_Normal);
  656. return true;
  657. TCP_Command Command;
  658. //std::string data(outbuf, outlen);
  659. std::string outData(outbuf, outlen);
  660. //std::string data = CAES::Decrypt(outData, m_strAesKey, m_strAesKey);
  661. std::string data = outData;
  662. //Json::Reader reader;
  663. //Json::Value root;
  664. //if (reader.parse(data, root)) {
  665. // Command.wMainCmdID = root["mainID"].asInt();
  666. // Command.wSubCmdID = root["subID"].asInt();
  667. //}
  668. //else {
  669. //LOG_WARN(_T("receive's data parse json error"));
  670. // throw TEXT("parse error");
  671. //}
  672. //玩家进后台的状态更新
  673. //m_dwKNRecvTickCount = GetTickCount();
  674. if (m_bForeground == false) {
  675. setForeground(true);
  676. }
  677. //内核命令
  678. if (Command.wMainCmdID == MDM_KN_COMMAND) {
  679. switch (Command.wSubCmdID) {
  680. case SUB_KN_DETECT_SOCKET: { //网络检测
  681. SendData(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, m_wRountID);
  682. break;
  683. }
  684. default: {
  685. throw TEXT("非法命令码");
  686. }
  687. }
  688. }
  689. else {
  690. //消息处理
  691. m_pIServerSocketItemSink->OnSocketReadEvent(Command, (void*)data.c_str(), data.size(), this);
  692. }
  693. break;
  694. }
  695. case WS_PING_FRAME: {
  696. //printf ("receive ping frame,framesize:%d\n", frameSize);
  697. char cbSendData[SOCKET_TCP_BUFFER];
  698. int encodesize = zl::net::ws::encodeFrame(zl::net::ws::WsFrameType::WS_PONG_FRAME, NULL, 0, cbSendData, SOCKET_TCP_BUFFER);
  699. SendRawData(cbSendData, encodesize);
  700. break;
  701. }
  702. case WS_PONG_FRAME: {
  703. // printf ("receive pong frame,framesize:%d\n", frameSize);
  704. break;
  705. }
  706. case WS_CLOSE_FRAME: {
  707. //printf ("receive close frame\n");
  708. //CloseSocket (m_wRountID);
  709. return false;
  710. }
  711. default: {
  712. //LOG_WARN(_T("receive unknow frame,close socket,type:%d"), (int)type);
  713. //CloseSocket (m_wRountID);
  714. return false;
  715. }
  716. }
  717. //删除缓存数据
  718. m_wRecvSize -= frameSize;
  719. MoveMemory(m_cbRecvBuf, m_cbRecvBuf + frameSize, m_wRecvSize);
  720. }
  721. }
  722. catch (...) {
  723. //LOG_WARN(_T("parse json error or could not find mainID,subID,close socket"));
  724. //CloseSocket (m_wRountID);
  725. return false;
  726. }
  727. return true;
  728. }
  729. bool CServerSocketItem::isWebSocket() {
  730. return m_connectType == WEBSOCKET;
  731. }
  732. bool CServerSocketItem::isWinSocket() {
  733. return m_connectType == WINSOCKET;
  734. }
  735. bool CServerSocketItem::sendPingFrame() {
  736. char cbSendData[SOCKET_TCP_BUFFER];
  737. int encodesize = zl::net::ws::encodeFrame(zl::net::ws::WsFrameType::WS_PING_FRAME, NULL, 0, cbSendData, SOCKET_TCP_BUFFER);
  738. return SendRawData(cbSendData, encodesize);
  739. }
  740. bool CServerSocketItem::setForeground(bool foreground) {
  741. m_bForeground = foreground;
  742. m_pIServerSocketItemSink->OnSocketForegroundEvent(this);
  743. return true;
  744. }
  745. //应答消息 --websocket新增
  746. bool CTCPNetworkEngine::OnSocketForegroundEvent(CServerSocketItem * pServerSocketItem) {
  747. //效验数据
  748. ASSERT(pServerSocketItem != NULL);
  749. if (NULL == pServerSocketItem) {
  750. return false;
  751. }
  752. //投递消息
  753. if (m_bService == false) {
  754. return false;
  755. }
  756. m_QueueServiceEvent.PostNetworkForegroundEvent(pServerSocketItem->GetSocketID(), pServerSocketItem->isForeground());
  757. return true;
  758. }
  759. //关闭完成通知
  760. bool CServerSocketItem::OnCloseCompleted()
  761. {
  762. //效验状态
  763. ASSERT(m_hSocket == INVALID_SOCKET);
  764. ASSERT(m_OverLappedSendActive.GetCount() == 0);
  765. //关闭事件
  766. ASSERT(m_bNotify == false);
  767. if (m_bNotify == false)
  768. {
  769. m_bNotify = true;
  770. m_pIServerSocketItemSink->OnSocketCloseEvent(this);
  771. }
  772. //状态变量
  773. ResetSocketData();
  774. return true;
  775. }
  776. //加密数据
  777. WORD CServerSocketItem::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize, BYTE cbDataKind)
  778. {
  779. WORD i = 0;
  780. //效验参数
  781. ASSERT(wDataSize >= sizeof(TCP_Head));
  782. ASSERT(wDataSize <= (sizeof(TCP_Head)+SOCKET_TCP_BUFFER));
  783. ASSERT(wBufferSize >= (wDataSize + 2 * sizeof(DWORD)));
  784. //填写信息头
  785. TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
  786. pHead->TCPInfo.wPacketSize = wDataSize;
  787. //pHead->TCPInfo.cbDataKind = DK_MAPPED;
  788. pHead->TCPInfo.cbDataKind = DK_MAPPED_NEW;
  789. #ifdef MY_ENCRYPT
  790. BYTE checkCode = 0;
  791. for (WORD i = sizeof(TCP_Info); i < wDataSize; i++)
  792. {
  793. checkCode += pcbDataBuffer[i];
  794. pcbDataBuffer[i] = MapSendByteEx(pcbDataBuffer[i]);
  795. }
  796. pHead->TCPInfo.cbCheckCode = ~checkCode + 1;
  797. //设置变量
  798. m_dwSendPacketCount++;
  799. #else
  800. m_MyEncrypt.EncryptBuffer(pcbDataBuffer + 4, wDataSize - 4);
  801. #endif
  802. return wDataSize;
  803. }
  804. //解密数据
  805. WORD CServerSocketItem::CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize)
  806. {
  807. WORD i = 0;
  808. //效验参数
  809. ASSERT(wDataSize >= sizeof(TCP_Head));
  810. ASSERT(((TCP_Head *)pcbDataBuffer)->TCPInfo.wPacketSize == wDataSize);
  811. #ifdef MY_ENCRYPT
  812. //效验码与字节映射
  813. TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
  814. for (i = sizeof(TCP_Info); i < wDataSize; i++)
  815. {
  816. if (pHead->TCPInfo.cbDataKind == DK_MAPPED_NEW)
  817. {
  818. pcbDataBuffer[i] = MapRecvByteEx(pcbDataBuffer[i]);
  819. }
  820. //else if (pHead->TCPInfo.cbDataKind == DK_MAPPED)
  821. //{
  822. // pcbDataBuffer[i] = MapRecvByte(pcbDataBuffer[i]);
  823. //}
  824. }
  825. #else
  826. m_MyEncrypt.DecryptBuffer(pcbDataBuffer + 4, wDataSize - 4);
  827. #endif
  828. return wDataSize;
  829. }
  830. //////////////////////////////////////////////////////////////////////////
  831. //构造函数
  832. CServerSocketRSThread::CServerSocketRSThread(void)
  833. {
  834. m_hCompletionPort = NULL;
  835. }
  836. //析构函数
  837. CServerSocketRSThread::~CServerSocketRSThread(void)
  838. {
  839. }
  840. //配置函数
  841. bool CServerSocketRSThread::InitThread(HANDLE hCompletionPort)
  842. {
  843. ASSERT(hCompletionPort != NULL);
  844. m_hCompletionPort = hCompletionPort;
  845. return true;
  846. }
  847. //运行函数
  848. bool CServerSocketRSThread::OnEventThreadRun()
  849. {
  850. //效验参数
  851. ASSERT(m_hCompletionPort != NULL);
  852. //变量定义
  853. DWORD dwThancferred = 0;
  854. OVERLAPPED * pOverLapped = NULL;
  855. COverLapped * pSocketLapped = NULL;
  856. CServerSocketItem * pServerSocketItem = NULL;
  857. //等待完成端口
  858. BOOL bSuccess = GetQueuedCompletionStatus(m_hCompletionPort, &dwThancferred, (PULONG_PTR)& pServerSocketItem, &pOverLapped, INFINITE);
  859. if ((bSuccess == FALSE) && (GetLastError() != ERROR_NETNAME_DELETED)) return false;
  860. if ((pServerSocketItem == NULL) && (pOverLapped == NULL)) return false;
  861. //处理操作
  862. ASSERT(pOverLapped != NULL);
  863. ASSERT(pServerSocketItem != NULL);
  864. pSocketLapped = CONTAINING_RECORD(pOverLapped, COverLapped, m_OverLapped);
  865. switch (pSocketLapped->GetOperationType())
  866. {
  867. case OperationType_Recv: //SOCKET 数据读取
  868. {
  869. COverLappedRecv * pOverLappedRecv = (COverLappedRecv *)pSocketLapped;
  870. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  871. pServerSocketItem->OnRecvCompleted(pOverLappedRecv, dwThancferred);
  872. break;
  873. }
  874. case OperationType_Send: //SOCKET 数据发送
  875. {
  876. COverLappedSend * pOverLappedSend = (COverLappedSend *)pSocketLapped;
  877. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  878. pServerSocketItem->OnSendCompleted(pOverLappedSend, dwThancferred);
  879. break;
  880. }
  881. }
  882. return true;
  883. }
  884. //////////////////////////////////////////////////////////////////////////
  885. //构造函数
  886. CSocketAcceptThread::CSocketAcceptThread(void)
  887. {
  888. m_hCompletionPort = NULL;
  889. m_pTCPSocketManager = NULL;
  890. m_hListenSocket = INVALID_SOCKET;
  891. }
  892. //析构函数
  893. CSocketAcceptThread::~CSocketAcceptThread(void)
  894. {
  895. }
  896. //配置函数
  897. bool CSocketAcceptThread::InitThread(HANDLE hCompletionPort, SOCKET hListenSocket, CTCPNetworkEngine * pTCPSocketManager)
  898. {
  899. ASSERT(hCompletionPort != NULL);
  900. ASSERT(pTCPSocketManager != NULL);
  901. ASSERT(hListenSocket != INVALID_SOCKET);
  902. m_hListenSocket = hListenSocket;
  903. m_hCompletionPort = hCompletionPort;
  904. m_pTCPSocketManager = pTCPSocketManager;
  905. return true;
  906. }
  907. //运行函数
  908. bool CSocketAcceptThread::OnEventThreadRun()
  909. {
  910. //效验参数
  911. ASSERT(m_hCompletionPort != NULL);
  912. ASSERT(m_pTCPSocketManager != NULL);
  913. //设置变量
  914. SOCKADDR_IN SocketAddr;
  915. CServerSocketItem * pServerSocketItem = NULL;
  916. SOCKET hConnectSocket = INVALID_SOCKET;
  917. int nBufferSize = sizeof(SocketAddr);
  918. try
  919. {
  920. //监听连接
  921. hConnectSocket = WSAAccept(m_hListenSocket, (SOCKADDR *)& SocketAddr, &nBufferSize, NULL, NULL);
  922. if (hConnectSocket == INVALID_SOCKET) return false;
  923. //CTraceService::TraceString(TEXT("新的房间连接"), TraceLevel_Normal);
  924. //获取连接
  925. pServerSocketItem = m_pTCPSocketManager->ActiveSocketItem();
  926. if (pServerSocketItem == NULL)
  927. {
  928. CTraceService::TraceString(TEXT("申请连接对象失败"), TraceLevel_Exception);
  929. throw TEXT("申请连接对象失败");
  930. }
  931. //激活对象
  932. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  933. pServerSocketItem->Attach(hConnectSocket, SocketAddr.sin_addr.S_un.S_addr, SocketAddr.sin_port);
  934. CreateIoCompletionPort((HANDLE)hConnectSocket, m_hCompletionPort, (ULONG_PTR)pServerSocketItem, 0);
  935. pServerSocketItem->RecvData();
  936. }
  937. catch (...)
  938. {
  939. CTraceService::TraceString(TEXT("连接失败请检查原因!!"), TraceLevel_Exception);
  940. //清理对象
  941. ASSERT(pServerSocketItem == NULL);
  942. if (hConnectSocket != INVALID_SOCKET) {
  943. //LINGER lingerStruct;
  944. //lingerStruct.l_onoff = 1;
  945. //lingerStruct.l_linger = 0;
  946. //setsockopt(hConnectSocket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct));
  947. closesocket(hConnectSocket);
  948. }
  949. }
  950. return true;
  951. }
  952. //////////////////////////////////////////////////////////////////////////
  953. //构造函数
  954. CSocketDetectThread::CSocketDetectThread(void)
  955. {
  956. m_dwTickCount = 0;;
  957. m_pTCPSocketManager = NULL;
  958. }
  959. //析构函数
  960. CSocketDetectThread::~CSocketDetectThread(void)
  961. {
  962. }
  963. //配置函数
  964. bool CSocketDetectThread::InitThread(CTCPNetworkEngine * pTCPSocketManager)
  965. {
  966. //效验参数
  967. ASSERT(pTCPSocketManager != NULL);
  968. //设置变量
  969. m_dwTickCount = 0L;
  970. m_pTCPSocketManager = pTCPSocketManager;
  971. return true;
  972. }
  973. //运行函数
  974. bool CSocketDetectThread::OnEventThreadRun()
  975. {
  976. //效验参数
  977. ASSERT(m_pTCPSocketManager != NULL);
  978. //设置间隔
  979. Sleep(500);
  980. m_dwTickCount += 500L;
  981. //检测连接
  982. if (m_dwTickCount > 15000L)
  983. {
  984. m_dwTickCount = 0L;
  985. m_pTCPSocketManager->DetectSocket();
  986. }
  987. return true;
  988. }
  989. //////////////////////////////////////////////////////////////////////////
  990. //构造函数
  991. CTCPNetworkEngine::CTCPNetworkEngine(void)
  992. {
  993. m_bService = false;
  994. m_wListenPort = 0;
  995. m_dwLastDetect = 0;
  996. m_wMaxSocketItem = 0;
  997. m_hCompletionPort = NULL;
  998. m_hServerSocket = INVALID_SOCKET;
  999. return;
  1000. }
  1001. //析构函数
  1002. CTCPNetworkEngine::~CTCPNetworkEngine(void)
  1003. {
  1004. //停止服务
  1005. ConcludeService();
  1006. //释放存储连接
  1007. CServerSocketItem * pSocketItem = NULL;
  1008. for (INT_PTR i = 0; i < m_StorageSocketItem.GetCount(); i++)
  1009. {
  1010. pSocketItem = m_StorageSocketItem[i];
  1011. ASSERT(pSocketItem != NULL);
  1012. SafeDelete(pSocketItem);
  1013. }
  1014. m_StorageSocketItem.RemoveAll();
  1015. return;
  1016. }
  1017. //接口查询
  1018. void * CTCPNetworkEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  1019. {
  1020. QUERYINTERFACE(ITCPNetworkEngine, Guid, dwQueryVer);
  1021. QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
  1022. QUERYINTERFACE_IUNKNOWNEX(ITCPNetworkEngine, Guid, dwQueryVer);
  1023. return NULL;
  1024. }
  1025. //设置接口
  1026. bool CTCPNetworkEngine::SetTCPNetworkEngineEvent(IUnknownEx * pIUnknownEx)
  1027. {
  1028. //状态判断
  1029. if (m_bService == true)
  1030. {
  1031. CTraceService::TraceString(TEXT("网络引擎处于服务状态,绑定操作忽略"), TraceLevel_Exception);
  1032. return false;
  1033. }
  1034. //设置接口
  1035. if (m_QueueServiceEvent.SetQueueServiceSink(pIUnknownEx) == false)
  1036. {
  1037. CTraceService::TraceString(TEXT("网络引擎与触发服务绑定失败"), TraceLevel_Exception);
  1038. return false;
  1039. }
  1040. return true;
  1041. }
  1042. #include <Nb30.h>
  1043. struct tagAstatInfo
  1044. {
  1045. ADAPTER_STATUS AdapterStatus; //网卡状态
  1046. NAME_BUFFER NameBuff[16]; //名字缓冲
  1047. };
  1048. //#define LEN_NETWORK_ID 33
  1049. //网卡地址
  1050. bool GetMACAddress(TCHAR szMACAddress[LEN_NETWORK_ID])
  1051. {
  1052. //变量定义
  1053. HINSTANCE hInstance = NULL;
  1054. //执行逻辑
  1055. __try
  1056. {
  1057. //加载 DLL
  1058. hInstance = LoadLibrary(TEXT("NetApi32.dll"));
  1059. if (hInstance == NULL) __leave;
  1060. //获取函数
  1061. typedef BYTE __stdcall NetBiosProc(NCB * Ncb);
  1062. NetBiosProc * pNetBiosProc = (NetBiosProc *)GetProcAddress(hInstance, "Netbios");
  1063. if (pNetBiosProc == NULL) __leave;
  1064. //变量定义
  1065. NCB Ncb;
  1066. LANA_ENUM LanaEnum;
  1067. ZeroMemory(&Ncb, sizeof(Ncb));
  1068. ZeroMemory(&LanaEnum, sizeof(LanaEnum));
  1069. //枚举网卡
  1070. Ncb.ncb_command = NCBENUM;
  1071. Ncb.ncb_length = sizeof(LanaEnum);
  1072. Ncb.ncb_buffer = (BYTE *)&LanaEnum;
  1073. if ((pNetBiosProc(&Ncb) != NRC_GOODRET) || (LanaEnum.length == 0)) __leave;
  1074. //获取地址
  1075. if (LanaEnum.length>0)
  1076. {
  1077. //变量定义
  1078. tagAstatInfo Adapter;
  1079. ZeroMemory(&Adapter, sizeof(Adapter));
  1080. //重置网卡
  1081. Ncb.ncb_command = NCBRESET;
  1082. Ncb.ncb_lana_num = LanaEnum.lana[0];
  1083. if (pNetBiosProc(&Ncb) != NRC_GOODRET) __leave;
  1084. //获取状态
  1085. Ncb.ncb_command = NCBASTAT;
  1086. Ncb.ncb_length = sizeof(Adapter);
  1087. Ncb.ncb_buffer = (BYTE *)&Adapter;
  1088. Ncb.ncb_lana_num = LanaEnum.lana[0];
  1089. strcpy((char *)Ncb.ncb_callname, "*");
  1090. if (pNetBiosProc(&Ncb) != NRC_GOODRET) __leave;
  1091. //获取地址
  1092. for (INT i = 0; i<6; i++)
  1093. {
  1094. ASSERT((i * 2)<LEN_NETWORK_ID);
  1095. _stprintf(&szMACAddress[i * 2], TEXT("%02X"), Adapter.AdapterStatus.adapter_address[i]);
  1096. }
  1097. }
  1098. }
  1099. //结束清理
  1100. __finally
  1101. {
  1102. //释放资源
  1103. if (hInstance != NULL)
  1104. {
  1105. FreeLibrary(hInstance);
  1106. hInstance = NULL;
  1107. }
  1108. //错误断言
  1109. if (AbnormalTermination() == TRUE)
  1110. {
  1111. ASSERT(FALSE);
  1112. }
  1113. }
  1114. return true;
  1115. }
  1116. //设置参数
  1117. bool CTCPNetworkEngine::SetServiceParameter(WORD wServicePort, WORD wMaxConnect, LPCTSTR pszCompilation)
  1118. {
  1119. //效验状态
  1120. if (m_bService == true)
  1121. {
  1122. CTraceService::TraceString(TEXT("网络引擎处于服务状态,端口绑定操作忽略"), TraceLevel_Exception);
  1123. return false;
  1124. }
  1125. //判断参数
  1126. /*if (wServicePort == 0)
  1127. {
  1128. CTraceService::TraceString(TEXT("网络端口错误,端口绑定操作失败"), TraceLevel_Exception);
  1129. return false;
  1130. }*/
  1131. //设置变量
  1132. m_wListenPort = wServicePort;
  1133. m_wMaxSocketItem = wMaxConnect;
  1134. return true;
  1135. }
  1136. //启动服务
  1137. bool CTCPNetworkEngine::StartService()
  1138. {
  1139. DWORD i = 0;
  1140. //效验状态
  1141. if (m_bService == true)
  1142. {
  1143. CTraceService::TraceString(TEXT("网络引擎重复启动,启动操作忽略"), TraceLevel_Warning);
  1144. return true;
  1145. }
  1146. //判断端口
  1147. if (m_wListenPort == 0)
  1148. {
  1149. m_wListenPort = PORT_GAMECYHD;
  1150. }
  1151. //绑定对象
  1152. if (m_SendQueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  1153. {
  1154. CTraceService::TraceString(TEXT("网络引擎与触发服务绑定失败"), TraceLevel_Exception);
  1155. return false;
  1156. }
  1157. try
  1158. {
  1159. //获取系统信息
  1160. SYSTEM_INFO SystemInfo;
  1161. GetSystemInfo(&SystemInfo);
  1162. DWORD dwThreadCount = SystemInfo.dwNumberOfProcessors;
  1163. //建立完成端口
  1164. m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, SystemInfo.dwNumberOfProcessors);
  1165. if (m_hCompletionPort == NULL) throw TEXT("网络引擎完成端口创建失败");
  1166. //建立监听SOCKET
  1167. struct sockaddr_in SocketAddr;
  1168. memset(&SocketAddr, 0, sizeof(SocketAddr));
  1169. SocketAddr.sin_addr.s_addr = INADDR_ANY;
  1170. SocketAddr.sin_family = AF_INET;
  1171. SocketAddr.sin_port = htons(m_wListenPort);
  1172. m_hServerSocket = WSASocket(AF_INET, SOCK_STREAM, /*0*/IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
  1173. if (m_hServerSocket == INVALID_SOCKET) throw TEXT("网络引擎监听 SOCKET 创建失败");
  1174. BOOL bMobile = TRUE;
  1175. for (;;){
  1176. if (0 != bind(m_hServerSocket, (SOCKADDR*)& SocketAddr, sizeof(SocketAddr)))
  1177. {
  1178. //++加点提示
  1179. CString str;
  1180. str.Format(L"绑定端口失败port=%d", m_wListenPort);
  1181. CTraceService::TraceString(str, TraceLevel_Warning);
  1182. closesocket(m_hServerSocket);
  1183. }
  1184. else
  1185. {
  1186. CString str;
  1187. str.Format(L"绑定端口成功port=%d", m_wListenPort);
  1188. CTraceService::TraceString(str, TraceLevel_Normal);
  1189. break;
  1190. }
  1191. m_hServerSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
  1192. if (m_hServerSocket == INVALID_SOCKET) throw TEXT("网络引擎监听 SOCKET 创建失败");
  1193. m_wListenPort++;
  1194. SocketAddr.sin_family = AF_INET;
  1195. SocketAddr.sin_addr.s_addr = 0;
  1196. SocketAddr.sin_port = htons(m_wListenPort);
  1197. }
  1198. //int iErrorCode = bind(m_hServerSocket, (SOCKADDR*) & SocketAddr, sizeof(SocketAddr));
  1199. //if (iErrorCode == SOCKET_ERROR) throw TEXT("网络引擎监听端口被占用,端口绑定失败");
  1200. int iErrorCode = listen(m_hServerSocket, 200);
  1201. if (iErrorCode == SOCKET_ERROR) throw TEXT("网络引擎监听端口被占用,端口监听失败");
  1202. //启动发送队列
  1203. bool bSuccess = m_SendQueueService.StartService();
  1204. if (bSuccess == false) throw TEXT("网络引擎发送队列服务启动失败");
  1205. //建立读写线程
  1206. for (i = 0; i < dwThreadCount; i++)
  1207. {
  1208. CServerSocketRSThread * pServerSocketRSThread = new CServerSocketRSThread();
  1209. if (pServerSocketRSThread == NULL) throw TEXT("网络引擎读写线程服务创建失败");
  1210. bSuccess = pServerSocketRSThread->InitThread(m_hCompletionPort);
  1211. if (bSuccess == false) throw TEXT("网络引擎读写线程服务配置失败");
  1212. m_SocketRSThreadArray.Add(pServerSocketRSThread);
  1213. }
  1214. //建立应答线程
  1215. bSuccess = m_SocketAcceptThread.InitThread(m_hCompletionPort, m_hServerSocket, this);
  1216. if (bSuccess == false) throw TEXT("网络引擎网络监听线程服务配置");
  1217. //运行读写线程
  1218. for (i = 0; i < dwThreadCount; i++)
  1219. {
  1220. CServerSocketRSThread * pServerSocketRSThread = m_SocketRSThreadArray[i];
  1221. ASSERT(pServerSocketRSThread != NULL);
  1222. bSuccess = pServerSocketRSThread->StartThread();
  1223. if (bSuccess == false) throw TEXT("网络引擎读写线程服务启动失败");
  1224. }
  1225. //网络检测线程
  1226. m_SocketDetectThread.InitThread(this);
  1227. bSuccess = m_SocketDetectThread.StartThread();
  1228. if (bSuccess == false) throw TEXT("网络引检测线程服务启动失败");
  1229. //运行应答线程
  1230. bSuccess = m_SocketAcceptThread.StartThread();
  1231. if (bSuccess == false) throw TEXT("网络引擎监听线程服务启动失败");
  1232. //设置变量
  1233. m_bService = true;
  1234. }
  1235. catch (LPCTSTR pszError)
  1236. {
  1237. CTraceService::TraceString(pszError, TraceLevel_Exception);
  1238. return false;
  1239. }
  1240. return true;
  1241. }
  1242. //停止服务
  1243. bool CTCPNetworkEngine::ConcludeService()
  1244. {
  1245. //设置变量
  1246. m_bService = false;
  1247. m_dwLastDetect = 0L;
  1248. //停止检测线程
  1249. m_SocketDetectThread.ConcludeThread(INFINITE);
  1250. //终止应答线程
  1251. if (m_hServerSocket != INVALID_SOCKET)
  1252. {
  1253. //LINGER lingerStruct;
  1254. //lingerStruct.l_onoff = 1;
  1255. //lingerStruct.l_linger = 0;
  1256. //setsockopt(m_hServerSocket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct));
  1257. closesocket(m_hServerSocket);
  1258. m_hServerSocket = INVALID_SOCKET;
  1259. }
  1260. m_SocketAcceptThread.ConcludeThread(INFINITE);
  1261. //停止发送队列
  1262. m_SendQueueService.ConcludeService();
  1263. //释放读写线程
  1264. INT_PTR nCount = m_SocketRSThreadArray.GetCount(), i = 0;
  1265. if (m_hCompletionPort != NULL)
  1266. {
  1267. for (i = 0; i < nCount; i++) PostQueuedCompletionStatus(m_hCompletionPort, 0, NULL, NULL);
  1268. }
  1269. for (i = 0; i < nCount; i++)
  1270. {
  1271. CServerSocketRSThread * pSocketThread = m_SocketRSThreadArray[i];
  1272. ASSERT(pSocketThread != NULL);
  1273. pSocketThread->ConcludeThread(INFINITE);
  1274. SafeDelete(pSocketThread);
  1275. }
  1276. m_SocketRSThreadArray.RemoveAll();
  1277. //关闭完成端口
  1278. if (m_hCompletionPort != NULL)
  1279. {
  1280. CloseHandle(m_hCompletionPort);
  1281. m_hCompletionPort = NULL;
  1282. }
  1283. //关闭连接
  1284. CServerSocketItem * pServerSocketItem = NULL;
  1285. for (i = 0; i < m_ActiveSocketItem.GetCount(); i++)
  1286. {
  1287. pServerSocketItem = m_ActiveSocketItem[i];
  1288. ASSERT(pServerSocketItem != NULL);
  1289. pServerSocketItem->CloseSocket(pServerSocketItem->GetRountID());
  1290. pServerSocketItem->ResetSocketData();
  1291. }
  1292. m_FreeSocketItem.Append(m_ActiveSocketItem);
  1293. m_ActiveSocketItem.RemoveAll();
  1294. m_QueueServiceEvent.SetQueueServiceSink(NULL);
  1295. return true;
  1296. }
  1297. //应答消息
  1298. bool CTCPNetworkEngine::OnSocketAcceptEvent(CServerSocketItem * pServerSocketItem)
  1299. {
  1300. //效验数据
  1301. ASSERT(pServerSocketItem != NULL);
  1302. if (NULL == pServerSocketItem) return false;
  1303. //投递消息
  1304. if (m_bService == false) return false;
  1305. m_QueueServiceEvent.PostNetworkAcceptEvent(pServerSocketItem->GetSocketID(), pServerSocketItem->GetClientAddr());
  1306. return true;
  1307. }
  1308. CString CTCPNetworkEngine::dwIP2csIP(DWORD dwIP)
  1309. {
  1310. CString strIP = _T("");
  1311. WORD add1, add2, add3, add4;
  1312. add1 = (WORD)(dwIP & 255);
  1313. add2 = (WORD)((dwIP >> 8) & 255);
  1314. add3 = (WORD)((dwIP >> 16) & 255);
  1315. add4 = (WORD)((dwIP >> 24) & 255);
  1316. strIP.Format(_T("%d.%d.%d.%d"), add1, add2, add3, add4);
  1317. return strIP;
  1318. }
  1319. //同步消息
  1320. bool CTCPNetworkEngine::OnTBDataEvent(int iCommend, DWORD dwContextID, void * pBuffer, WORD wDataSize)
  1321. {
  1322. //投递消息
  1323. m_QueueServiceEvent.PostChangeData(iCommend, dwContextID, pBuffer, wDataSize);
  1324. return true;
  1325. }
  1326. //网络读取消息
  1327. bool CTCPNetworkEngine::OnSocketReadEvent(TCP_Command Command, void * pBuffer, WORD wDataSize, CServerSocketItem * pServerSocketItem)
  1328. {
  1329. //效验数据
  1330. ASSERT(pServerSocketItem != NULL);
  1331. if (NULL == pServerSocketItem) return false;
  1332. //效验状态
  1333. if (m_bService == false) return false;
  1334. m_QueueServiceEvent.PostNetworkReadEvent(pServerSocketItem->GetSocketID(), Command, pBuffer, wDataSize);
  1335. return true;
  1336. }
  1337. //网络关闭消息
  1338. bool CTCPNetworkEngine::OnSocketCloseEvent(CServerSocketItem * pServerSocketItem)
  1339. {
  1340. //效验参数
  1341. ASSERT(pServerSocketItem != NULL);
  1342. if (NULL == pServerSocketItem) return false;
  1343. try
  1344. {
  1345. //效验状态
  1346. if (m_bService == false) return false;
  1347. //计算时间
  1348. WORD wIndex = pServerSocketItem->GetIndex();
  1349. WORD wRountID = pServerSocketItem->GetRountID();
  1350. DWORD dwClientAddr = pServerSocketItem->GetClientAddr();
  1351. DWORD dwConnectTime = pServerSocketItem->GetConnectTime();
  1352. //////////////////////////////////////////////////////////////////////////,这里要调整
  1353. m_QueueServiceEvent.PostNetworkCloseEvent(pServerSocketItem->GetSocketID(), dwClientAddr, dwConnectTime);
  1354. //释放连接
  1355. FreeSocketItem(pServerSocketItem);
  1356. }
  1357. catch (...) {}
  1358. return true;
  1359. }
  1360. //通知回调函数(发送队列线程调用)
  1361. void CTCPNetworkEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
  1362. {
  1363. switch (wIdentifier)
  1364. {
  1365. case QUEUE_SEND_REQUEST: //发送请求
  1366. {
  1367. //效验数据
  1368. tagSendDataRequest * pSendDataRequest = (tagSendDataRequest *)pBuffer;
  1369. ASSERT(wDataSize >= (sizeof(tagSendDataRequest)-sizeof(pSendDataRequest->cbSendBuf)));
  1370. ASSERT(wDataSize == (pSendDataRequest->wDataSize + sizeof(tagSendDataRequest)-sizeof(pSendDataRequest->cbSendBuf)));
  1371. //群发数据
  1372. if (pSendDataRequest->dwSocketID == 0)
  1373. {
  1374. //获取活动项
  1375. {
  1376. CWHDataLocker lcok(m_CriticalSection);
  1377. m_TempSocketItem.RemoveAll();
  1378. m_TempSocketItem.Copy(m_ActiveSocketItem);
  1379. }
  1380. //循环发送数据
  1381. CServerSocketItem * pServerSocketItem = NULL;
  1382. for (INT_PTR i = 0; i < m_TempSocketItem.GetCount(); i++)
  1383. {
  1384. pServerSocketItem = m_TempSocketItem[i];
  1385. ASSERT(pServerSocketItem != NULL);
  1386. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  1387. if (pServerSocketItem->IsAllowBatch())//第一次不允许??
  1388. {
  1389. pServerSocketItem->SendData(pSendDataRequest->cbSendBuf, pSendDataRequest->wDataSize, pSendDataRequest->wMainCmdID,
  1390. pSendDataRequest->wSubCmdID, pServerSocketItem->GetRountID());
  1391. }
  1392. }
  1393. }
  1394. else
  1395. {
  1396. //单项发送
  1397. CServerSocketItem * pServerSocketItem = EnumSocketItem(LOWORD(pSendDataRequest->dwSocketID));
  1398. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  1399. pServerSocketItem->SendData(pSendDataRequest->cbSendBuf, pSendDataRequest->wDataSize, pSendDataRequest->wMainCmdID,
  1400. pSendDataRequest->wSubCmdID, HIWORD(pSendDataRequest->dwSocketID));
  1401. }
  1402. break;
  1403. }
  1404. case QUEUE_SAFE_CLOSE: //安全关闭
  1405. {
  1406. //效验数据
  1407. ASSERT(wDataSize == sizeof(tagSafeCloseSocket));
  1408. tagSafeCloseSocket * pSafeCloseSocket = (tagSafeCloseSocket *)pBuffer;
  1409. //安全关闭
  1410. try
  1411. {
  1412. CServerSocketItem * pServerSocketItem = EnumSocketItem(LOWORD(pSafeCloseSocket->dwSocketID));
  1413. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  1414. pServerSocketItem->ShutDownSocket(HIWORD(pSafeCloseSocket->dwSocketID));
  1415. }
  1416. catch (...)
  1417. {
  1418. }
  1419. break;
  1420. }
  1421. case QUEUE_ALLOW_BATCH: //允许群发
  1422. {
  1423. //效验数据
  1424. ASSERT(wDataSize == sizeof(tagAllowBatchSend));
  1425. tagAllowBatchSend * pAllowBatchSend = (tagAllowBatchSend *)pBuffer;
  1426. //设置群发
  1427. CServerSocketItem * pServerSocketItem = EnumSocketItem(LOWORD(pAllowBatchSend->dwSocketID));
  1428. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  1429. pServerSocketItem->AllowBatchSend(HIWORD(pAllowBatchSend->dwSocketID), pAllowBatchSend->cbAllow ? true : false, pAllowBatchSend->cbMask);
  1430. break;
  1431. }
  1432. case QUEUE_DETECT_SOCKET: //检测连接
  1433. {
  1434. //获取活动项
  1435. {
  1436. CWHDataLocker lcok(m_CriticalSection);
  1437. m_TempSocketItem.RemoveAll();
  1438. m_TempSocketItem.Copy(m_ActiveSocketItem);
  1439. }
  1440. //break; //田丰
  1441. //构造数据
  1442. CMD_KN_DetectSocket DetectSocket;
  1443. ZeroMemory(&DetectSocket, sizeof(DetectSocket));
  1444. //变量定义
  1445. WORD wRountID = 0;
  1446. DWORD dwNowTickCount = GetTickCount();
  1447. DWORD dwBreakTickCount = __max(dwNowTickCount - m_dwLastDetect, TIME_BREAK_READY);
  1448. //设置变量
  1449. m_dwLastDetect = GetTickCount();
  1450. //检测连接
  1451. for (INT_PTR i = 0; i < m_TempSocketItem.GetCount(); i++)
  1452. {
  1453. //变量定义
  1454. CServerSocketItem * pServerSocketItem = m_TempSocketItem[i];
  1455. DWORD dwRecvTickCount = pServerSocketItem->GetRecvTickCount();
  1456. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  1457. //间隔检查
  1458. if (dwRecvTickCount >= dwNowTickCount) continue;
  1459. //检测连接
  1460. if (pServerSocketItem->IsReadySend() == true)
  1461. {
  1462. //#ifndef DEBUG
  1463. if ((dwNowTickCount - dwRecvTickCount) > dwBreakTickCount)
  1464. {
  1465. pServerSocketItem->CloseSocket(pServerSocketItem->GetRountID());
  1466. continue;
  1467. }
  1468. //#endif
  1469. }
  1470. else
  1471. {
  1472. if ((dwNowTickCount - dwRecvTickCount) > TIME_BREAK_CONNECT)
  1473. {
  1474. pServerSocketItem->CloseSocket(pServerSocketItem->GetRountID());
  1475. continue;
  1476. }
  1477. }
  1478. //发送数据
  1479. if (pServerSocketItem->IsReadySend() == true)
  1480. {
  1481. wRountID = pServerSocketItem->GetRountID();
  1482. DetectSocket.dwSendTickCount = GetTickCount();
  1483. Socket::PB_KN_DetectSocket pSocket;
  1484. pSocket.set_dwsendtickcount(DetectSocket.dwSendTickCount);
  1485. pSocket.set_dwrecvtickcount(DetectSocket.dwRecvTickCount);
  1486. std::string pbdata = pSocket.SerializePartialAsString();
  1487. pServerSocketItem->SendData((void*)pbdata.c_str(), pbdata.length(), MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, wRountID);
  1488. }
  1489. }
  1490. break;
  1491. }
  1492. default:
  1493. {
  1494. ASSERT(FALSE);
  1495. }
  1496. }
  1497. return;
  1498. }
  1499. //获取空闲对象
  1500. CServerSocketItem * CTCPNetworkEngine::ActiveSocketItem()
  1501. {
  1502. CWHDataLocker lock(m_CriticalSection);
  1503. //获取空闲对象
  1504. CServerSocketItem * pServerSocketItem = NULL;
  1505. if (m_FreeSocketItem.GetCount() > 0)
  1506. {
  1507. INT_PTR nItemPostion = m_FreeSocketItem.GetCount() - 1;
  1508. pServerSocketItem = m_FreeSocketItem[nItemPostion];
  1509. ASSERT(pServerSocketItem != NULL);
  1510. m_FreeSocketItem.RemoveAt(nItemPostion);
  1511. m_ActiveSocketItem.Add(pServerSocketItem);
  1512. }
  1513. //创建新对象
  1514. if (pServerSocketItem == NULL)
  1515. {
  1516. WORD wStorageCount = (WORD)m_StorageSocketItem.GetCount();
  1517. if (wStorageCount < m_wMaxSocketItem)
  1518. {
  1519. try
  1520. {
  1521. pServerSocketItem = new CServerSocketItem(wStorageCount, this);
  1522. if (pServerSocketItem == NULL) return NULL;
  1523. m_StorageSocketItem.Add(pServerSocketItem);
  1524. m_ActiveSocketItem.Add(pServerSocketItem);
  1525. }
  1526. catch (...)
  1527. {
  1528. CString str;
  1529. str.Format(TEXT("连接失败,目前连接数%d"), wStorageCount);
  1530. CTraceService::TraceString(str, TraceLevel_Normal);
  1531. return NULL;
  1532. }
  1533. }
  1534. }
  1535. return pServerSocketItem;
  1536. }
  1537. //获取连接对象
  1538. CServerSocketItem * CTCPNetworkEngine::EnumSocketItem(WORD wIndex)
  1539. {
  1540. CWHDataLocker lock(m_CriticalSection);
  1541. if (wIndex < m_StorageSocketItem.GetCount())
  1542. {
  1543. CServerSocketItem * pServerSocketItem = m_StorageSocketItem[wIndex];
  1544. ASSERT(pServerSocketItem != NULL);
  1545. return pServerSocketItem;
  1546. }
  1547. return NULL;
  1548. }
  1549. //释放连接对象
  1550. bool CTCPNetworkEngine::FreeSocketItem(CServerSocketItem * pServerSocketItem)
  1551. {
  1552. //效验参数
  1553. ASSERT(pServerSocketItem != NULL);
  1554. //释放对象
  1555. CWHDataLocker lock(m_CriticalSection);
  1556. INT_PTR nActiveCount = m_ActiveSocketItem.GetCount();
  1557. for (int i = 0; i < nActiveCount; i++)
  1558. {
  1559. if (pServerSocketItem == m_ActiveSocketItem[i])
  1560. {
  1561. m_ActiveSocketItem.RemoveAt(i);
  1562. m_FreeSocketItem.Add(pServerSocketItem);
  1563. return true;
  1564. }
  1565. }
  1566. //释放失败
  1567. ASSERT(FALSE);
  1568. return false;
  1569. }
  1570. //检测连接
  1571. bool CTCPNetworkEngine::DetectSocket()
  1572. {
  1573. return m_SendQueueService.AddToQueue(QUEUE_DETECT_SOCKET, NULL, 0);
  1574. }
  1575. //发送函数
  1576. bool CTCPNetworkEngine::SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID)
  1577. {
  1578. TRACE("\n\n<<<***Fun=[%s] SEND CMD[%d:%d]***\n\n", __FUNCTION__, wMainCmdID, wSubCmdID);
  1579. //效益状态
  1580. ASSERT(m_bService == true);
  1581. if (m_bService == false) return false;
  1582. //构造数据
  1583. tagSendDataRequest SendRequest;
  1584. SendRequest.wMainCmdID = wMainCmdID;
  1585. SendRequest.wSubCmdID = wSubCmdID;
  1586. SendRequest.dwSocketID = dwSocketID;
  1587. SendRequest.wDataSize = 0;
  1588. //加入发送队列
  1589. WORD wSendSize = sizeof(SendRequest)-sizeof(SendRequest.cbSendBuf);
  1590. return m_SendQueueService.AddToQueue(QUEUE_SEND_REQUEST, &SendRequest, wSendSize);
  1591. }
  1592. //发送函数
  1593. bool CTCPNetworkEngine::SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize)
  1594. {
  1595. TRACE("\n\n<<<***Fun=[%s] SEND CMD[%d:%d]***\n\n", __FUNCTION__, wMainCmdID, wSubCmdID);
  1596. //效益状态
  1597. ASSERT(m_bService == true);
  1598. if (m_bService == false) return false;
  1599. //效益数据
  1600. ASSERT((wDataSize + sizeof(TCP_Head)) <= SOCKET_TCP_BUFFER);
  1601. if ((wDataSize + sizeof(TCP_Head)) > SOCKET_TCP_BUFFER) return false;
  1602. //构造数据
  1603. tagSendDataRequest SendRequest;
  1604. SendRequest.wMainCmdID = wMainCmdID;
  1605. SendRequest.wSubCmdID = wSubCmdID;
  1606. SendRequest.dwSocketID = dwSocketID;
  1607. SendRequest.wDataSize = wDataSize;
  1608. if (wDataSize > 0)
  1609. {
  1610. ASSERT(pData != NULL);
  1611. CopyMemory(SendRequest.cbSendBuf, pData, wDataSize);
  1612. }
  1613. //加入发送队列
  1614. WORD wSendSize = sizeof(SendRequest)-sizeof(SendRequest.cbSendBuf) + wDataSize;
  1615. return m_SendQueueService.AddToQueue(QUEUE_SEND_REQUEST, &SendRequest, wSendSize);
  1616. }
  1617. //批量发送
  1618. bool CTCPNetworkEngine::SendDataBatch(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize, BYTE cbBatchMask)
  1619. {
  1620. TRACE("\n\n<<<***Fun=[%s] SEND CMD[%d:%d]***\n\n", __FUNCTION__, wMainCmdID, wSubCmdID);
  1621. //效益状态
  1622. if (m_bService == false) return false;
  1623. //效益数据
  1624. ASSERT((wDataSize + sizeof(TCP_Head)) <= SOCKET_TCP_BUFFER);
  1625. if ((wDataSize + sizeof(TCP_Head)) > SOCKET_TCP_BUFFER) return false;
  1626. //构造数据
  1627. tagSendDataRequest SendRequest;
  1628. SendRequest.wMainCmdID = wMainCmdID;
  1629. SendRequest.wSubCmdID = wSubCmdID;
  1630. SendRequest.dwSocketID = 0;
  1631. SendRequest.wDataSize = wDataSize;
  1632. if (wDataSize > 0)
  1633. {
  1634. ASSERT(pData != NULL);
  1635. CopyMemory(SendRequest.cbSendBuf, pData, wDataSize);
  1636. }
  1637. //加入发送队列
  1638. WORD wSendSize = sizeof(SendRequest)-sizeof(SendRequest.cbSendBuf) + wDataSize;
  1639. return m_SendQueueService.AddToQueue(QUEUE_SEND_REQUEST, &SendRequest, wSendSize);
  1640. }
  1641. //关闭连接
  1642. bool CTCPNetworkEngine::CloseSocket(DWORD dwSocketID)
  1643. {
  1644. CServerSocketItem * pServerSocketItem = EnumSocketItem(LOWORD(dwSocketID));
  1645. if (pServerSocketItem == NULL) return false;
  1646. CWHDataLocker lock(pServerSocketItem->GetSignedLock());
  1647. return pServerSocketItem->CloseSocket(HIWORD(dwSocketID));
  1648. }
  1649. //设置关闭
  1650. bool CTCPNetworkEngine::ShutDownSocket(DWORD dwSocketID)
  1651. {
  1652. tagSafeCloseSocket SafeCloseSocket;
  1653. SafeCloseSocket.dwSocketID = dwSocketID;
  1654. return m_SendQueueService.AddToQueue(QUEUE_SAFE_CLOSE, &SafeCloseSocket, sizeof(SafeCloseSocket));
  1655. }
  1656. //允许群发
  1657. bool CTCPNetworkEngine::AllowBatchSend(DWORD dwSocketID, bool bAllow, BYTE cbBatchMask)
  1658. {
  1659. tagAllowBatchSend AllowBatchSendNode;
  1660. AllowBatchSendNode.dwSocketID = dwSocketID;
  1661. AllowBatchSendNode.cbAllow = bAllow;
  1662. AllowBatchSendNode.cbMask = cbBatchMask;
  1663. return m_SendQueueService.AddToQueue(QUEUE_ALLOW_BATCH, &AllowBatchSendNode, sizeof(tagAllowBatchSend));
  1664. }
  1665. //////////////////////////////////////////////////////////////////////////
  1666. //建立对象函数
  1667. extern "C" __declspec(dllexport) void * __cdecl CreateTCPNetworkEngine(const GUID & Guid, DWORD dwInterfaceVer)
  1668. {
  1669. //建立对象
  1670. CTCPNetworkEngine * pTCPSocketEngine = NULL;
  1671. try
  1672. {
  1673. pTCPSocketEngine = new CTCPNetworkEngine();
  1674. if (pTCPSocketEngine == NULL) throw TEXT("创建失败");
  1675. void * pObject = pTCPSocketEngine->QueryInterface(Guid, dwInterfaceVer);
  1676. if (pObject == NULL) throw TEXT("接口查询失败");
  1677. return pObject;
  1678. }
  1679. catch (...) {}
  1680. //清理对象
  1681. SafeDelete(pTCPSocketEngine);
  1682. return NULL;
  1683. }
  1684. //////////////////////////////////////////////////////////////////////////