1 °³¿ä
"58.17.128.0/17"°ú °°Àº Çü½ÄÀÇ ÁÖ¼Ò ÁöÁ¤ ¹æ½Ä. ¶ó¿ìÅÍ °°Àº °÷¿¡¼ ¸¹ÀÌ »ç¿ëÇÑ´Ù. ƯÁ¤ IP¿¡¼ÀÇ Á¢¼ÓÀ» ¸·¾Æ´Þ¶ó°í ÀÌ Çü½ÄÀÇ ¸®½ºÆ®°¡ ¿Ã ¶§µµ ÀÖ´Ù.
2 CIDR ¹æ½ÄÀÇ ÁÖ¼Ò ¸ñ·ÏÀ» ÀÌ¿ëÇØ ƯÁ¤ ÁÖ¼Ò°¡ ¸ñ·Ï¿¡ µé¾îÀÖ´ÂÁö ¾Ë¾Æ³»±â
"58.17.128.0/17" Çü½ÄÀÇ ¹®ÀÚ¿Àº ½ÃÀÛ IP¿Í ³¡ IP »çÀÌÀÇ ¹üÀ§·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. À̸¦ Ä÷º¼Ç¿¡´Ù Áý¾î³Ö¾îµÐ ´ÙÀ½, ÀÔ·ÂÀ¸·Î µé¾î¿Â IP¸¦ Æ÷ÇÔÇÏ´Â ¹üÀ§°¡ ÀÖ´ÂÁö üũÇÏ¸é µÈ´Ù. ¾Æ·¡ÀÇ ±¸ÇöÀº ±×³É ¹è¿·Î ¸ñ·ÏÀ» °ü¸®Çϰí ÀÖÀ¸³ª, IntervalTree °°Àº µ¥ÀÌÅÍ ±¸Á¶¸¦ ÀÌ¿ëÇϸé Á» ´õ ³ªÀº(?) ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Ù.
class cCidrMask
{
private:
struct MASK
{
unsigned int StartIP; ///< ½ÃÀÛ IP
unsigned int EndIP; ///< ³¡ IP
};
std::vector<MASK> m_MaskArray; ///< CIDR ¸¶½ºÅ©ÀÇ ¹è¿
public:
/// \brief »ý¼ºÀÚ
cCidrMask() {}
/// \brief ¼Ò¸êÀÚ
~cCidrMask() { m_MaskArray.clear(); }
public:
/// \brief CIDR ¸¶½ºÅ©¸¦ Ãß°¡ÇÑ´Ù.
/// \param cidr "58.14.0.0/16" °°Àº Çü½ÄÀÇ ¹®ÀÚ¿
/// \return bool ¹«»çÈ÷ Ãß°¡Çß´Ù¸é true, À߸øµÈ ¹®ÀÚ¿À̶ó¸é false
bool Add(const std::string& cidr)
{
bool success = false;
size_t pos = cidr.find_first_of('/');
if (pos != std::string::npos)
{
std::string elements[2] = { cidr.substr(0, pos), cidr.substr(pos+1) };
unsigned int ip = IP2Int(elements[0].c_str());
int bits = atoi(elements[1].c_str());
unsigned int mask = ~(0xFFFFFFFF >> bits);
unsigned int network = ip & mask;
unsigned int broadcast = network + ~mask;
unsigned int usable = (bits > 30) ? 0 : (broadcast - network - 1);
if (usable > 0)
{
MASK mask;
mask.StartIP = network + 1;
mask.EndIP = broadcast - 1;
m_MaskArray.push_back(mask);
success = true;
}
}
return success;
}
/// \brief ÁÖ¾îÁø IP°¡ Ãß°¡ÇÑ ¸¶½ºÅ© ÁßÀÇ Çϳª¿¡ Æ÷ÇԵǴÂÁö¸¦ üũÇÑ´Ù.
/// \param address üũÇÒ IP ÁÖ¼Ò ¹®ÀÚ¿ "58.14.0.0"
/// \return bool Æ÷ÇԵǾî ÀÖ´Ù¸é true, Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù¸é false
bool Exist(const std::string& address) const
{
unsigned int converted = IP2Int(address.c_str());
bool exist = false;
for (size_t i=0; i<m_MaskArray.size(); ++i)
{
if (m_MaskArray[i].StartIP <= converted && converted <= m_MaskArray[i].EndIP)
{
exist = true;
break;
}
}
return exist;
}
private:
/// \brief ¹®ÀÚ¿ ÇüÅÂÀÇ IP ÁÖ¼Ò¸¦ 4¹ÙÀÌÆ® ¼ýÀÚ·Î º¯È¯
unsigned int IP2Int(const std::string& ip)
{
char buf[256] = {0, };
strcpy_s(buf, ARRAYSIZE(buf), ip.c_str());
unsigned int converted = 0;
unsigned int count = 0;
unsigned int bits = 24;
LPSTR context = NULL;
LPSTR token = strtok_s(buf, ".", &context);
while (token && count < 4)
{
converted += (static_cast<unsigned int>(atoi(token))) << bits;
bits -= 8;
count += 1;
token = strtok_s(NULL, ".", &context);
}
return converted;
}
};
cCidrMask mask;
mask.Add("58.17.128.0/17");
bool a = mask.Exist("58.17.127.1");
bool b = mask.Exist("58.17.128.1");
bool c = mask.Exist("58.17.128.2");
3 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)