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

模拟服务器

开发平台:

C/C++

  1. // ConnTrack.cpp: implementation of the CConnTrack class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ConnTrack.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. CConnTrack::CConnTrack()
  10. {
  11. }
  12. CConnTrack::~CConnTrack()
  13. {
  14. }
  15. BOOL CConnTrack::Initialize()
  16. {
  17. Clearup();
  18. return TRUE;
  19. }
  20. BOOL CConnTrack::Uninitialize()
  21. {
  22. return TRUE;
  23. }
  24. BOOL CConnTrack::Clearup()
  25. {
  26. m_csAccess.Lock();
  27. m_mapFamily.clear();
  28. m_csAccess.Unlock();
  29. return TRUE;
  30. }
  31. BOOL CConnTrack::RegConnect(unsigned long conn, BYTE fami, BYTE meth)
  32. {
  33. m_csAccess.Lock();
  34. METHODMAP& methods = m_mapFamily[fami];
  35. CONNSET& conns = methods[meth];
  36. conns.insert(conn);
  37. m_csAccess.Unlock();
  38. return TRUE;
  39. }
  40. BOOL CConnTrack::UnregConnect(unsigned long conn, BYTE fami, BYTE meth)
  41. {
  42. m_csAccess.Lock();
  43. FAMILYMAP::iterator itFami = m_mapFamily.find(fami);
  44. if (itFami != m_mapFamily.end())
  45. {
  46. METHODMAP& methods = (*itFami).second;
  47. METHODMAP::iterator itMeth = methods.find(meth);
  48. if (itMeth != methods.end())
  49. {
  50. CONNSET& conns = (*itMeth).second;
  51. conns.erase(conn);
  52. }
  53. }
  54. m_csAccess.Unlock();
  55. return TRUE;
  56. }
  57. BOOL CConnTrack::ClearConnect(unsigned long conn)
  58. {
  59. m_csAccess.Lock();
  60. for (FAMILYMAP::iterator itFami = m_mapFamily.begin(); itFami != m_mapFamily.end(); itFami++)
  61. {
  62. METHODMAP& methods = (*itFami).second;
  63. for (METHODMAP::iterator itMeth = methods.begin(); itMeth != methods.end(); itMeth++)
  64. {
  65. CONNSET& conns = (*itMeth).second;
  66. conns.erase(conn);
  67. }
  68. }
  69. m_csAccess.Unlock();
  70. return TRUE;
  71. }
  72. CConnTrack::CONNECTS CConnTrack::DupConns(BYTE fami, BYTE meth)
  73. {
  74. CONNECTS connsRet;
  75. m_csAccess.Lock();
  76. FAMILYMAP::iterator itFami = m_mapFamily.find(fami);
  77. if (itFami != m_mapFamily.end())
  78. {
  79. METHODMAP& methods = (*itFami).second;
  80. METHODMAP::iterator itMeth = methods.find(meth);
  81. if (itMeth != methods.end())
  82. {
  83. CONNSET& conns = (*itMeth).second;
  84. connsRet.reserve(conns.size()); //<==优化
  85. for (CONNSET::iterator itConn = conns.begin(); itConn != conns.end(); itConn++)
  86. connsRet.push_back((*itConn));
  87. }
  88. }
  89. m_csAccess.Unlock();
  90. return connsRet;
  91. }
  92. BOOL CConnTrack::IsConnAt(unsigned long conn, BYTE fami, BYTE meth)
  93. {
  94. BOOL bFind = FALSE;
  95. m_csAccess.Lock();
  96. FAMILYMAP::iterator itFami = m_mapFamily.find(fami);
  97. if (itFami != m_mapFamily.end())
  98. {
  99. METHODMAP& methods = (*itFami).second;
  100. METHODMAP::iterator itMeth = methods.find(meth);
  101. if (itMeth != methods.end())
  102. {
  103. CONNSET& conns = (*itMeth).second;
  104. bFind = conns.find(conn) != conns.end();
  105. }
  106. }
  107. m_csAccess.Unlock();
  108. return bFind;
  109. }
  110. BOOL CConnTrack::IsConnOnFamily(unsigned long conn, BYTE fami)
  111. {
  112. BOOL bFind = FALSE;
  113. m_csAccess.Lock();
  114. FAMILYMAP::iterator itFami = m_mapFamily.find(fami);
  115. if (itFami != m_mapFamily.end())
  116. {
  117. METHODMAP& methods = (*itFami).second;
  118. for (METHODMAP::iterator itMeth = methods.begin(); itMeth != methods.end(); itMeth++)
  119. {
  120. CONNSET& conns = (*itMeth).second;
  121. bFind = conns.find(conn) != conns.end();
  122. if (bFind)
  123. break;
  124. }
  125. }
  126. m_csAccess.Unlock();
  127. return bFind;
  128. }
  129. BOOL CConnTrack::IsConnOnMethod(unsigned long conn, BYTE meth)
  130. {
  131. BOOL bFind = FALSE;
  132. m_csAccess.Lock();
  133. for (FAMILYMAP::iterator itFami = m_mapFamily.begin(); itFami != m_mapFamily.end(); itFami++)
  134. {
  135. METHODMAP& methods = (*itFami).second;
  136. METHODMAP::iterator itMeth = methods.find(meth);
  137. if (itMeth != methods.end())
  138. {
  139. CONNSET& conns = (*itMeth).second;
  140. bFind = conns.find(conn) != conns.end();
  141. if (bFind)
  142. break;
  143. }
  144. }
  145. m_csAccess.Unlock();
  146. return bFind;
  147. }