我有以下存储在TXT文件中的IP列表(CIDR格式):<
58.200.0.0/13
202.115.0.0/16
121.48.0.0/15
219.224.128.0/18
...
但我不知道如何确定我的IP是否属于此列表.我在Windows平台上使用Qt C++框架.
首先,您需要将每个CIDR表示法范围分解为网络(虚线IP地址)部分和多个位.使用此位数来生成掩码.然后,您只需要(range & mask) == (your_ip & mask)像操作系统一样测试是否:
一些psuedo-C代码:
my_ip = inet_addr( my_ip_str )            // Convert your IP string to uint32
range = inet_addr( CIDR.split('/')[0] )   // Convert IP part of CIDR to uint32
num_bits = atoi( CIDR.split('/')[1] )     // Convert bits part of CIDR to int
mask = (1 << num_bits) - 1                // Calc mask
if (my_ip & mask) == (range & mask)
    // in range.
您可以找到一个图书馆来帮助您.Boost似乎有一个IP4类,它有<和>运营商.但是你仍然需要使用CIDR表示法.
参考:
通过Qt文档,我遇到了QHostAddress :: parseSubnet(const QString&subnet),它可以采用CIDR风格的IP范围,是Qt 4.5中的新功能.因此,我可以编写以下代码来解决它:(假设myIP的类型为QHostAddress)
if(myIP.isInSubnet(QHostAddress::parseSubnet("219.224.128.0/18")) {
    //then the IP belongs to the CIDR IP range 219.224.128.0/18
}
至于对问题的更好理解和见解,@ Jonathon Reinhart的回答非常有帮助.
之前的答案已涵盖从文本到IP地址类的转换.您可以使用QHostAddress :: isInSubnet()来检查范围.当您的IP地址在提供的地址和掩码内时,返回true.
例如,这是一个检查IP地址是否为zeroconfig(169.254.1.0到169.254.254.255)的示例:
bool IsZeroconfig(const QHostAddress &ipAddress)
{
    QPair<QHostAddress, int> rangeZeroconfig = QHostAddress::parseSubnet("169.254.0.0/16");
    if (ipAddress.isInSubnet(rangeZeroconfig))
    {
        QPair<QHostAddress, int> preZeroconfig = QHostAddress::parseSubnet("169.254.1.0/24");
        QPair<QHostAddress, int> postZeroconfig = QHostAddress::parseSubnet("169.254.255.0/24");
        if ((!ipAddress.isInSubnet(preZeroconfig)) && (!ipAddress.isInSubnet(postZeroconfig)))
        {
            return true;
        }
    }
    return false;
}
| 归档时间: | 
 | 
| 查看次数: | 5848 次 | 
| 最近记录: |