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

模拟服务器

开发平台:

C/C++

  1. // HostServer.cpp: implementation of the CHostServer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "HostServer.h"
  6. #include "HostConnect.h"
  7. #include "S3Relay.h"
  8. //////////////////////////////////////////////////////////////////////
  9. // Construction/Destruction
  10. //////////////////////////////////////////////////////////////////////
  11. CHostServer::CHostServer()
  12. {
  13. }
  14. CHostServer::~CHostServer()
  15. {
  16. }
  17. CNetConnect* CHostServer::CreateConnect(CNetServer* pNetServer, unsigned long id)
  18. {
  19. return new CHostConnect((CHostServer*)pNetServer, id);
  20. }
  21. void CHostServer::DestroyConnect(CNetConnect* pConn)
  22. {
  23. delete pConn;
  24. }
  25. void CHostServer::OnBuildup()
  26. {
  27. AUTOLOCKWRITE(m_lockIpMap);
  28. rTRACE("host server startup");
  29. }
  30. void CHostServer::OnClearup()
  31. {
  32. AUTOLOCKWRITE(m_lockIpMap);
  33. m_mapIp2Connect.clear();
  34. rTRACE("host server shutdown");
  35. }
  36. void CHostServer::OnClientConnectCreate(CNetConnect* pConn)
  37. {
  38. AUTOLOCKWRITE(m_lockIpMap);
  39. m_mapIp2Connect[pConn->GetIP()] = (CHostConnect*)pConn;
  40. }
  41. void CHostServer::OnClientConnectClose(CNetConnect* pConn)
  42. {
  43. AUTOLOCKWRITE(m_lockIpMap);
  44. m_mapIp2Connect.erase(pConn->GetIP());
  45. }
  46. CNetConnectDup CHostServer::FindHostConnectByIP(DWORD IP)
  47. {
  48. AUTOLOCKREAD(m_lockIpMap);
  49. IP2CONNECTMAP::iterator it = m_mapIp2Connect.find(IP);
  50. if (it == m_mapIp2Connect.end())
  51. return CNetConnectDup();
  52. CHostConnect* pHostConn = (*it).second;
  53. if (!pHostConn)
  54. return CNetConnectDup();
  55. return CNetConnectDup(*pHostConn);
  56. }
  57. BOOL CHostServer::FindPlayerByAcc(CHostConnect* pConn, const std::_tstring& acc, CNetConnectDup* pConnDup, std::_tstring* pRole, DWORD* pNameID, unsigned long* pParam, std::_tstring* pRealAcc)
  58. {
  59. AUTOLOCKREAD(m_lockIpMap);
  60. for (IP2CONNECTMAP::iterator it = m_mapIp2Connect.begin(); it != m_mapIp2Connect.end(); it++)
  61. {
  62. CHostConnect* pConnMe = (*it).second;
  63. if (pConnMe != pConn)
  64. {
  65. if (pConnMe->FindPlayerByAcc(acc, pRole, pNameID, pParam, pRealAcc))
  66. {
  67. if (pConnDup != NULL)
  68. *pConnDup = *pConnMe;
  69. return TRUE;
  70. }
  71. }
  72. }
  73. return FALSE;
  74. }
  75. BOOL CHostServer::FindPlayerByRole(CHostConnect* pConn, const std::_tstring& role, CNetConnectDup* pConnDup, std::_tstring* pAcc, DWORD* pNameID, unsigned long* pParam, std::_tstring* pRealRole)
  76. {
  77. AUTOLOCKREAD(m_lockIpMap);
  78. for (IP2CONNECTMAP::iterator it = m_mapIp2Connect.begin(); it != m_mapIp2Connect.end(); it++)
  79. {
  80. CHostConnect* pConnMe = (*it).second;
  81. if (pConnMe != pConn)
  82. {
  83. if (pConnMe->FindPlayerByRole(role, pAcc, pNameID, pParam, pRealRole))
  84. {
  85. if (pConnDup != NULL)
  86. *pConnDup = *pConnMe;
  87. return TRUE;
  88. }
  89. }
  90. }
  91. return FALSE;
  92. }
  93. BOOL CHostServer::FindPlayerByIpParam(CHostConnect* pConn, DWORD ip, unsigned long param, CNetConnectDup* pConnDup, std::_tstring* pAcc, std::_tstring* pRole, DWORD* pNameID)
  94. {
  95. AUTOLOCKREAD(m_lockIpMap);
  96. IP2CONNECTMAP::const_iterator it = m_mapIp2Connect.find(ip);
  97. if (it == m_mapIp2Connect.end())
  98. return FALSE;
  99. CHostConnect* pConnMe = (*it).second;
  100. if (pConnMe != pConn)
  101. {
  102. if (pConnMe->FindPlayerByParam(param, pAcc, pRole, pNameID))
  103. {
  104. if (pConnDup != NULL)
  105. *pConnDup = *pConnMe;
  106. return TRUE;
  107. }
  108. }
  109. return FALSE;
  110. }
  111. /*
  112. BOOL CHostServer::BroadOnPlayer(BOOL byAcc, DWORD fromIP, unsigned long fromRelayID, const void* pData, size_t size)
  113. {
  114. AUTOLOCKREAD(m_lockIpMap);
  115. for (IP2CONNECTMAP::const_iterator it = m_mapIp2Connect.begin(); it != m_mapIp2Connect.end(); it++)
  116. {
  117. CHostConnect* pConnMe = (*it).second;
  118. pConnMe->BroadOnPlayer(byAcc, fromIP, fromRelayID, pData, size);
  119. }
  120. return FALSE;
  121. }
  122. */
  123. size_t CHostServer::GetPlayerCount()
  124. {
  125. AUTOLOCKREAD(m_lockIpMap);
  126. size_t total = 0;
  127. for (IP2CONNECTMAP::iterator it = m_mapIp2Connect.begin(); it != m_mapIp2Connect.end(); it++)
  128. {
  129. CHostConnect* pConn = (*it).second;
  130. assert(pConn);
  131. if (pConn)
  132. total += pConn->GetPlayerCount();
  133. }
  134. return total;
  135. }
  136. BOOL CHostServer::TraceInfo()
  137. {
  138. AUTOLOCKREAD(m_lockIpMap);
  139. std::_tstring info("message: [HostServer] ");
  140. char buffer[_MAX_PATH];
  141. sprintf(buffer, "<total: %d> : ", m_mapIp2Connect.size());
  142. info.append(buffer);
  143. for (IP2CONNECTMAP::iterator it = m_mapIp2Connect.begin(); it != m_mapIp2Connect.end(); it++)
  144. {
  145. if (it != m_mapIp2Connect.begin())
  146. info.append(", ");
  147. sprintf(buffer, "%08X", (*it).first);
  148. info.append(buffer);
  149. }
  150. rTRACE(info.c_str());
  151. return TRUE;
  152. }
  153. BOOL CHostServer::TracePlayer()
  154. {
  155. AUTOLOCKREAD(m_lockIpMap);
  156. std::_tstring info("message: [Player] : ");
  157. char buffer[_MAX_PATH];
  158. size_t total = 0;
  159. for (IP2CONNECTMAP::iterator it = m_mapIp2Connect.begin(); it != m_mapIp2Connect.end(); it++)
  160. {
  161. CHostConnect* pConn = (*it).second;
  162. assert(pConn);
  163. if (pConn)
  164. {
  165. if (it != m_mapIp2Connect.begin())
  166. info.append(", ");
  167. size_t count = pConn->GetPlayerCount();
  168. total += count;
  169. sprintf(buffer, "%08X: %d", (*it).first, count);
  170. info.append(buffer);
  171. }
  172. }
  173. sprintf(buffer, " <total: %d>", total);
  174. info.append(buffer);
  175. rTRACE(info.c_str());
  176. return TRUE;
  177. }