NetConnect.cpp
Upload User: dzyhzl
Upload Date: 2019-04-29
Package Size: 56270k
Code Size: 3k
Development Platform:

C/C++

  1. // NetConnect.cpp: implementation of the CNetConnect class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Global.h"
  6. #include "NetConnect.h"
  7. #include "NetServer.h"
  8. #include "S3Relay.h"
  9. #include "../../Multiserver/Heaven/Interface/IServer.h"
  10. #include "../../../headers/KProtocolDef.h"
  11. #include "../../../headers/KProtocol.h"
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CNetConnectDup::CNetConnectDup(const CNetConnect& netconnect)
  16.  : m_pServer(NULL), m_IP(netconnect.GetIP()), m_id(netconnect.GetID())
  17. {
  18. CNetServer* pNetServer = netconnect.GetServer();
  19. if (pNetServer)
  20. {
  21. m_pServer = pNetServer->GetServer();
  22. _SafeAddRef(m_pServer);
  23. }
  24. }
  25. BOOL CNetConnectDup::SendPackage(const void* pData, size_t size) const
  26. {
  27. dTRACKSENDDATA(pData, size);
  28. if(!m_pServer)
  29. return FALSE;
  30. m_pServer->SendData(m_id, pData, size);
  31. return TRUE;
  32. }
  33. CNetConnectDup& CNetConnectDup::operator =(const CNetConnect& src)
  34. {
  35. _SafeRelease(m_pServer);
  36. CNetServer* pNetServer = src.GetServer();
  37. if (pNetServer)
  38. {
  39. m_pServer = pNetServer->GetServer();
  40. _SafeAddRef(m_pServer);
  41. }
  42. m_IP = src.GetIP();
  43. m_id = src.GetID();
  44. return *this;
  45. }
  46. CNetConnect::CNetConnect(CNetServer* pNetServer, unsigned long id)
  47. : m_pNetServer(pNetServer), m_id(id), m_IP(0), m_port(0), m_disconnect(0L)
  48. {
  49. assert(m_pNetServer);
  50. const char* pInfo = m_pNetServer->GetServer()->GetClientInfo(id);
  51. if (pInfo)
  52. {
  53. m_IP = _a2ip(pInfo);
  54. const char* pColon = strchr(pInfo, ':');
  55. if (pColon)
  56. m_port = atoi(pColon + 1);
  57. }
  58. }
  59. CNetConnect::~CNetConnect()
  60. {
  61. }
  62. void CNetConnect::_NotifyClientConnectCreate()
  63. {
  64. OnClientConnectCreate();
  65. }
  66. void CNetConnect::_NotifyClientConnectClose()
  67. {
  68. if (m_disconnect)
  69. return;
  70. ++ m_disconnect;
  71. OnClientConnectClose();
  72. }
  73. HRESULT CNetConnect::OnMessage( VOID* pData, size_t size )
  74. {
  75. dTRACKRECVDATA(pData, size);
  76. RecvPackage(pData, size);
  77. return S_OK;
  78. }
  79. DWORD CNetConnect::Main(LPVOID lpParam)
  80. {
  81. #ifndef _WORKMODE_SINGLETHREAD
  82. EnterLoop();
  83. #endif
  84. while (!IsAskingStop())
  85. {
  86. #ifdef _WORKMODE_MULTITHREAD2
  87. BeginRoute();
  88. EndRoute();
  89. Sleep(2000);
  90. continue;
  91. #else
  92. DoRoute();
  93. Sleep(breathe_interval);
  94. #endif
  95. }
  96. #ifndef _WORKMODE_SINGLETHREAD
  97. LeaveLoop();
  98. #endif
  99. return 0;
  100. }
  101. BOOL CNetConnect::SendPackage(const void* pData, size_t size)
  102. {
  103. IServer* pServer = m_pNetServer->GetServer();
  104. if (pServer == NULL)
  105. return FALSE;
  106. dTRACKSENDDATA(pData, size);
  107. pServer->SendData(m_id, pData, size);
  108. return TRUE;
  109. }
  110. BOOL CNetConnect::IsReady() const
  111. {
  112. return m_pNetServer->GetServer() != NULL;
  113. }
  114. BOOL CNetConnect::DoRoute()
  115. {
  116. IServer* pServer = m_pNetServer->GetServer();
  117. if (pServer == NULL)
  118. return FALSE;
  119. BeginRoute();
  120. for ( ; ; )
  121. {
  122. size_t size = 0;
  123. const void* pData = pServer->GetPackFromClient(m_id, size);
  124. if (!pData || size <= 0)
  125. break;
  126. dTRACKRECVDATA(pData, size);
  127. RecvPackage(pData, size);
  128. }
  129. EndRoute();
  130. return TRUE;
  131. }
  132. BOOL CNetConnect::Route()
  133. {
  134. return DoRoute();
  135. }