ThreadFuncForMsg.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:4k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. extern HWND g_hStatusBar;
  3. extern SOCKET g_csock;
  4. extern HANDLE g_hSvrMsgEvnt;
  5. extern CWHQueue g_SendToUserQ;
  6. extern CWHQueue g_SendToServerQ;
  7. extern CWHDynamicArray<CSessionInfo> g_UserInfoArray;
  8. CWHAbusive g_xAbusive;
  9. DWORD WINAPI ThreadFuncForMsg(LPVOID lpParameter)
  10. {
  11. int nCount;
  12. _TDEFAULTMESSAGE DefMsg;
  13. int nBodyLen;
  14. _TMSGHEADER MsgHdr;
  15. char szDecodeSay[256];
  16. char szEncodeSay[256];
  17. char *pData;
  18. CSessionInfo* pSessionInfo;
  19. DWORD dwBytesSends;
  20. int nPos;
  21. UINT nIdentity = 0;
  22. MsgHdr.nCode = 0xAA55AA55;
  23. MsgHdr.wIdent = GM_DATA;
  24. // g_xAbusive.LoadAbusiveList();
  25. while(TRUE)
  26. {
  27. //Send packet to Game server.
  28. g_SendToServerQ.Lock();
  29. nCount = g_SendToServerQ.GetCount();
  30. if (nCount)
  31. {
  32. for (int nLoop = 0; nLoop < nCount; nLoop++)
  33. {
  34. _LPTSENDBUFF pSendBuff = (_LPTSENDBUFF)g_SendToServerQ.PopQ();
  35. if (pSendBuff)
  36. {
  37. if (pSessionInfo = g_UserInfoArray.GetData(pSendBuff->nGateIndex))
  38. {
  39. MsgHdr.nSocket = (int)pSendBuff->sock;
  40. MsgHdr.wUserGateIndex = pSendBuff->nGateIndex;
  41. MsgHdr.wUserListIndex = pSessionInfo->nServerUserIndex;
  42. if (pSessionInfo->fLoginCode)
  43. {
  44. pSessionInfo->fLoginCode = FALSE;
  45. // MsgHdr.nLength = (memlen(pSendBuff->szData) - 1);
  46. // SendSocketMsgS (&MsgHdr, MsgHdr.nLength, , 0, NULL);
  47. MsgHdr.nLength = sizeof(_TDEFAULTMESSAGE) + (memlen(pSendBuff->szData) - 1);
  48. SendSocketMsgS (&MsgHdr, sizeof(_TDEFAULTMESSAGE), (char *)&DefMsg, (memlen(pSendBuff->szData) - 1), pSendBuff->szData);
  49. }
  50. else
  51. {
  52. if (*pSendBuff->szData == '#')
  53. {
  54. if (memlen(pSendBuff->szData) > _DEFBLOCKSIZE + 2)
  55. {
  56. if (*(pSendBuff->szData + _DEFBLOCKSIZE + 2) == '!') // 3[#? !]
  57. {
  58. *(pSendBuff->szData + _DEFBLOCKSIZE + 2) = '';
  59. fnDecodeMessageA(&DefMsg, (pSendBuff->szData + 2)); // 2[#?] ? = Code
  60. MsgHdr.nLength = sizeof(_TDEFAULTMESSAGE);
  61. SendSocketMsgS(&MsgHdr, sizeof(_TDEFAULTMESSAGE), (char *)&DefMsg, 0, NULL);
  62. }
  63. else
  64. {
  65. nBodyLen = memlen(pSendBuff->szData + _DEFBLOCKSIZE + 2) - 2; // 2 = '!'
  66. pData = pSendBuff->szData + _DEFBLOCKSIZE + 2;
  67. pData[nBodyLen] = '';
  68. fnDecodeMessageA(&DefMsg, (pSendBuff->szData + 2)); // 2[#?] ? = Code
  69. if (DefMsg.wIdent == CM_SAY)
  70. {
  71. nPos = fnDecode6BitBufA(pData, szDecodeSay, sizeof(szDecodeSay));
  72. szDecodeSay[nPos] = '';
  73. g_xAbusive.ChangeAbusiveText(szDecodeSay);
  74. nPos = fnEncode6BitBufA((unsigned char *)szDecodeSay, szEncodeSay, memlen(szDecodeSay) - 1, sizeof(szEncodeSay));
  75. szEncodeSay[nPos] = '';
  76. pData = &szEncodeSay[0];
  77. }
  78. MsgHdr.nLength = sizeof(_TDEFAULTMESSAGE) + nBodyLen;
  79. SendSocketMsgS (&MsgHdr, sizeof(_TDEFAULTMESSAGE), (char *)&DefMsg, nBodyLen, pData);
  80. }
  81. } // if (memlen(pSendBuff->szData) > _DEFBLOCKSIZE + 2)
  82. } // if '#'
  83. }
  84. }
  85. delete pSendBuff;
  86. }
  87. }// for nLoop
  88. }
  89. g_SendToServerQ.Unlock();
  90. //Send Packet to Client
  91. for (int nLoop = 0; nLoop < _MAX_USER_ARRAY; nLoop++)
  92. {
  93. pSessionInfo = g_UserInfoArray.GetData(nLoop);
  94. if (pSessionInfo)
  95. {
  96. if (pSessionInfo->nSendBufferLen)
  97. {
  98. WSABUF Buf;
  99. Buf.len = memlen(pSessionInfo->SendBuffer) - 1;
  100. Buf.buf = pSessionInfo->SendBuffer;
  101. WSASend(pSessionInfo->sock, &Buf, 1, &dwBytesSends, 0, NULL, NULL);
  102. if (dwBytesSends < Buf.len)
  103. _RPT2(_CRT_WARN, "%d:%sn", memlen(pSessionInfo->SendBuffer) - 1, pSessionInfo->SendBuffer);
  104. /*#ifdef _DEBUG
  105. _RPT3(_CRT_WARN, "(%d)%d:%sn", pSessionInfo->sock, memlen(pSessionInfo->SendBuffer) - 1, pSessionInfo->SendBuffer);
  106. #endif*/
  107. pSessionInfo->nSendBufferLen = 0;
  108. }
  109. }
  110. }
  111. SleepEx(1, TRUE);
  112. }
  113. return 0;
  114. }