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

Ric*_*ard 5 c++ ip qt cidr

我有以下存储在TXT文件中的IP列表(CIDR格式):<

58.200.0.0/13
202.115.0.0/16
121.48.0.0/15
219.224.128.0/18
...
Run Code Online (Sandbox Code Playgroud)

但我不知道如何确定我的IP是否属于此列表.我在Windows平台上使用Qt C++框架.

Jon*_*art 8

首先,您需要将每个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.
Run Code Online (Sandbox Code Playgroud)

您可以找到一个图书馆来帮助您.Boost似乎有一个IP4类,它有<>运营商.但是你仍然需要使用CIDR表示法.

参考:


Ric*_*ard 6

通过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
}
Run Code Online (Sandbox Code Playgroud)

至于对问题的更好理解和见解,@ Jonathon Reinhart的回答非常有帮助.


par*_*y72 5

之前的答案已涵盖从文本到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;
}
Run Code Online (Sandbox Code Playgroud)