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

模拟服务器

开发平台:

C/C++

  1. // DealRelay.cpp: implementation of the CDealRelay class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Global.h"
  6. #include "DealRelay.h"
  7. //////////////////////////////////////////////////////////////////////
  8. //////////////////////////////////////////////////////////////////////
  9. ///////////////////////
  10. namespace dealrelay {
  11. ///////////////////////
  12. ////////////////////////////////
  13. //internal functions
  14. void _Proc2_Relay_AskWay_AccountRoleID(const CNetSockDupEx& NetSockDupEx, const void* pData, size_t size)
  15. {
  16. RELAY_ASKWAY_DATA* pAskWayData = (RELAY_ASKWAY_DATA*)pData;
  17. std::_tstring strAcc = (char*)(pAskWayData + 1);
  18. assert(!strAcc.empty());
  19. DWORD nameid = -1;
  20. unsigned long param = -1;
  21. CNetConnectDup conndup;
  22. if (g_HostServer.FindPlayerByAcc(NULL, strAcc, &conndup, NULL, &nameid, &param))
  23. {//find
  24. size_t pckgsize = sizeof(DWORD)*2 + size;
  25. RELAY_ASKWAY_DATA* pClntWayDataDup = (RELAY_ASKWAY_DATA*)_alloca(pckgsize);
  26. gFillClntwayPckg(nameid, param, pAskWayData, size, pClntWayDataDup, pckgsize);
  27. conndup.SendPackage(pClntWayDataDup, pckgsize);
  28. return;
  29. }
  30. //lose way
  31. size_t sizeLoseData = sizeof(RELAY_DATA) + size;
  32. RELAY_DATA* pLoseDataDup = (RELAY_DATA*)_alloca(sizeLoseData);
  33. gFillLosewayPckg(pAskWayData->nFromIP, pAskWayData->nFromRelayID, 
  34. pAskWayData, size, pLoseDataDup, sizeLoseData);
  35. NetSockDupEx.SendPackage(pLoseDataDup, sizeLoseData);
  36. }
  37. void _Proc1_Relay_Data(const CNetSockDupEx& NetSockDupEx, const void* pData, size_t size)
  38. {
  39. RELAY_DATA* pRelayData = (RELAY_DATA*)pData;
  40. assert (pRelayData->nFromIP != 0);
  41. if (pRelayData->nToIP == 0)
  42. {
  43. return;
  44. }
  45. if (pRelayData->nToIP == INADDR_BROADCAST)
  46. {
  47. assert(FALSE);
  48. return;
  49. }
  50. if (pRelayData->nToIP == gGetHostIP(global_adapt))
  51. {
  52. pRelayData->nToIP = 0;
  53. if (g_HostServer.IsConnectReady(pRelayData->nToRelayID))
  54. {
  55. CNetConnectDup conndup = g_HostServer.FindNetConnect(pRelayData->nToRelayID);
  56. if (conndup.IsValid())
  57. {
  58. conndup.SendPackage(pRelayData, size);
  59. return;
  60. }
  61. }
  62. }
  63. //lose way
  64. size_t sizeLoseData = sizeof(RELAY_DATA) + size;
  65. RELAY_DATA* pLoseDataDup = (RELAY_DATA*)_alloca(sizeLoseData);
  66. gFillLosewayPckg(pRelayData->nFromIP, pRelayData->nFromRelayID, 
  67. pRelayData, size, pLoseDataDup, sizeLoseData);
  68. NetSockDupEx.SendPackage(pLoseDataDup, sizeLoseData);
  69. }
  70. void _Proc1_Relay_AskWay(const CNetSockDupEx& NetSockDupEx, const void* pData, size_t size)
  71. {
  72. RELAY_ASKWAY_DATA* pAskWayData = (RELAY_ASKWAY_DATA*)pData;
  73. if (pAskWayData->seekMethod == rm_account_id)
  74. {
  75. _Proc2_Relay_AskWay_AccountRoleID(NetSockDupEx, pData, size);
  76. }
  77. }
  78. void _Proc1_Relay_LoseWay(const CNetSockDupEx& NetSockDupEx, const void* pData, size_t size)
  79. {
  80. RELAY_DATA* pLoseData = (RELAY_DATA*)pData;
  81. if (pLoseData->nFromIP == 0)
  82. {
  83. pLoseData->nFromIP = NetSockDupEx.GetSockIP();
  84. pLoseData->nFromRelayID = NetSockDupEx.GetSockParam();
  85. }
  86. if (pLoseData->nToIP == 0)
  87. {
  88. return;
  89. }
  90. if (pLoseData->nToIP == INADDR_BROADCAST)
  91. {
  92. assert(FALSE);
  93. return;
  94. }
  95. if (pLoseData->nToIP == gGetHostIP(global_adapt))
  96. {
  97. pLoseData->nToIP = 0;
  98. if (g_HostServer.IsConnectReady(pLoseData->nToRelayID))
  99. {
  100. CNetConnectDup conndup = g_HostServer.FindNetConnect(pLoseData->nToRelayID);
  101. if (conndup.IsValid())
  102. {
  103. conndup.SendPackage(pLoseData, size);
  104. return;
  105. }
  106. }
  107. }
  108. //lose way
  109. //don't more loseway
  110. }
  111. void _Proc0_Relay(const CNetSockDupEx& NetSockDupEx, const void* pData, size_t size)
  112. {
  113. EXTEND_HEADER* pHeader = (EXTEND_HEADER*)pData;
  114. if (pHeader->ProtocolID == relay_c2c_data)
  115. {
  116. _Proc1_Relay_Data(NetSockDupEx, pData, size);
  117. }
  118. else if (pHeader->ProtocolID == relay_c2c_askwaydata)
  119. {
  120. _Proc1_Relay_AskWay(NetSockDupEx, pData, size);
  121. }
  122. else if (pHeader->ProtocolID == relay_s2c_loseway)
  123. {
  124. _Proc1_Relay_LoseWay(NetSockDupEx, pData, size);
  125. }
  126. }
  127. void _RecvPackage(const CNetSockDupEx& NetSockDupEx, const void* pData, size_t size)
  128. {
  129. EXTEND_HEADER* pHeader = (EXTEND_HEADER*)pData;
  130. if (pHeader->ProtocolFamily == pf_relay)
  131. {
  132. _Proc0_Relay(NetSockDupEx, pData, size);
  133. }
  134. }
  135. ///////////////////////////////
  136. //the publish functions' body
  137. void DoRecvPackage(CRelayConnect* pConn, const void* pData, size_t size)
  138. {
  139. assert(pConn);
  140. _RecvPackage(CNetSockDupEx(CNetConnectDup(*pConn)), pData, size);
  141. }
  142. void DoRecvPackage(CRelayClient* pClnt, const void* pData, size_t size)
  143. {
  144. assert(pClnt);
  145. _RecvPackage(CNetSockDupEx(CNetClientDup(*pClnt)), pData, size);
  146. }
  147. CNetSockDupEx FindRelaySockByIP(DWORD ip)
  148. {
  149. CNetConnectDup netconndup;
  150. if (g_RelayServer.FindRelayConnectByIP(ip, &netconndup))
  151. return CNetSockDupEx(netconndup);
  152. CNetClientDup netclntdup;
  153. if (g_RelayCenter.FindRelayClientByIP(ip, &netclntdup))
  154. return CNetSockDupEx(netclntdup);
  155. return CNetSockDupEx();
  156. }
  157. BOOL BroadPackage(const void* pData, size_t size)
  158. {
  159. g_RelayServer.BroadPackage(pData, size);
  160. g_RelayCenter.BroadPackage(pData, size);
  161. return FALSE;
  162. }
  163. ///////////////////////
  164. } //namespace dealrelay
  165. ///////////////////////