如何使用Qt确定我的互联网IP是否属于给定的IP列表

How to determine whether my internet IP belongs to a given IP list using Qt

本文关键字:IP 是否 属于 列表 互联网 何使用 Qt 我的      更新时间:2023-10-16

我在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),就像您的操作系统所做的那样:

一些伪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表示法。

参考:

  • IP在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;
}