IPLocater.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // IPLocater.cpp: implementation of the CIPLocater class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "IPLocater.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. CIPLocater::CIPLocater()
  15. {
  16. m_pBuf = 0;
  17. m_bCreate = false;
  18. m_lBufCount = 0;
  19. }
  20. CIPLocater::~CIPLocater()
  21. {
  22. if (m_pBuf) 
  23. {
  24. delete m_pBuf;
  25. m_pBuf = 0;
  26. }
  27. }
  28. BOOL CIPLocater::Create(CString strIPdbpath)
  29. {
  30. m_vCountry.clear();
  31. m_vIndex.clear();
  32. if (m_pBuf) 
  33. {
  34. delete m_pBuf;
  35. m_pBuf = 0;
  36. }
  37. if (IsCreate())
  38. {
  39. // ASSERT(false);
  40. return false;
  41. }
  42. FILE* pfile = fopen(strIPdbpath, "rb");
  43. if (!pfile)
  44. {
  45. // ASSERT(false);
  46. return false;
  47. }
  48. ////////////////////////////////////////////////////////////////////////
  49. // read size
  50. long lCountryCount = 0, lIndexCount =0;
  51. fread(&lCountryCount, sizeof(char), sizeof(long), pfile);
  52. fread(&lIndexCount, sizeof(char), sizeof(long), pfile);
  53. fread(&m_lBufCount, sizeof(char), sizeof(long), pfile);
  54. ////////////////////////////////////////////////////////////////////////
  55. // read primary key.
  56. char* pBuf = new char[lCountryCount];
  57. auto_ptr<char> abuf(pBuf);
  58. memset(pBuf, 0, sizeof(lCountryCount));
  59. int iRet = fread(pBuf, sizeof(char), lCountryCount, pfile);
  60. if (iRet != lCountryCount)
  61. {
  62. // ASSERT(false);
  63. fclose(pfile);
  64. return false;
  65. }
  66. long lCount = 0;
  67. while (lCount < lCountryCount)
  68. {
  69. CString strTemp = pBuf + lCount;
  70. // ASSERT(!strTemp.IsEmpty());
  71. lCount += strTemp.GetLength() + 1;
  72. m_vCountry.push_back(strTemp);
  73. TRACE("%s, rn", strTemp.GetBuffer(0));
  74. }
  75. // ASSERT(lCount == lCountryCount);
  76. ////////////////////////////////////////////////////////////////////////
  77. // read index
  78. pBuf = new char[lIndexCount];
  79. auto_ptr<char> aindexbuf(pBuf);
  80. memset(pBuf, 0, sizeof(lIndexCount));
  81. iRet = fread(pBuf, sizeof(char), lIndexCount, pfile);
  82. if (iRet != lIndexCount)
  83. {
  84. // ASSERT(false);
  85. fclose(pfile);
  86. return false;
  87. }
  88. lCount = 0;
  89. while (lCount < lIndexCount)
  90. {
  91. long lbeg = *(ULONG*)(pBuf + lCount);
  92. lCount += sizeof(long);
  93. long linx= *(ULONG*)(pBuf + lCount);
  94. lCount += sizeof(long);
  95. m_vIndex.push_back(CSize(lbeg, linx));
  96. }
  97. // ASSERT(lCount == lIndexCount);
  98. m_pBuf = new char[m_lBufCount];
  99. memset(m_pBuf, 0, sizeof(m_lBufCount));
  100. iRet = fread(m_pBuf, sizeof(char), m_lBufCount, pfile);
  101. if (iRet != m_lBufCount)
  102. {
  103. // ASSERT(false);
  104. fclose(pfile);
  105. return false;
  106. }
  107. fclose(pfile);
  108. m_bCreate = true;
  109. return TRUE;
  110. }
  111. BOOL CIPLocater::IsCreate() const
  112. {
  113. return m_bCreate;
  114. }
  115. bool CIPLocater::FindIPName(CString strIP, CString &strName)const
  116. {
  117. ULONG lbeg = inet_addr(strIP.GetBuffer(0));
  118. if (lbeg == INADDR_NONE)
  119. {
  120. return false;
  121. }
  122. lbeg = ntohl(lbeg);
  123. return FindIPName(lbeg, strName);
  124. }
  125. bool CIPLocater::FindIPName(ULONG lIP, CString &strName)const
  126. {
  127. if (!IsCreate())
  128. {
  129. // ASSERT(false);
  130. return false;
  131. }
  132. strName.Empty();
  133. for (int i=0; i<m_vIndex.size(); i++)
  134. {
  135. if (lIP < m_vIndex[i].cx)
  136. {
  137. if (i <= 0)
  138. {
  139. // ASSERT(FALSE);
  140. return false;
  141. }
  142. if (m_vIndex[i - 1].cy < 0)
  143. return false;
  144. if (m_vIndex[i - 1].cy >= m_lBufCount )
  145. {
  146. // ASSERT(FALSE);
  147. return false;
  148. }
  149. long lnext = i; //m_vIndex[i].cy;
  150. while (m_vIndex[lnext].cy < 0)
  151. {
  152. if (lnext >= m_vIndex.size())
  153. return false;
  154. lnext ++;
  155. }
  156. ULONG lPrimaryIndex = *((ULONG *)(m_pBuf + m_vIndex[i - 1].cy));
  157. if (lPrimaryIndex >= m_vCountry.size() || lPrimaryIndex < 0)
  158. {
  159. // ASSERT(FALSE);
  160. return false;
  161. }
  162. strName += m_vCountry[lPrimaryIndex];
  163. char szText[1024] = {0};
  164. memcpy(szText, m_pBuf+ m_vIndex[i - 1].cy + sizeof(long), m_vIndex[lnext].cy - m_vIndex[i-1].cy - sizeof(long));
  165. strName += szText;
  166. return true;
  167. break;
  168. }
  169. }
  170. return false;
  171. }