【问题标题】:How to determine whether my internet IP belongs to a given IP list using Qt如何使用 Qt 确定我的互联网 IP 是否属于给定的 IP 列表
【发布时间】:2012-09-12 03:24:15
【问题描述】:

我在 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++ 框架。

【问题讨论】:

标签: c++ qt ip cidr


【解决方案1】:

首先,您需要将每个 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 class,其中有&lt;&gt; 运算符。但是您仍然需要使用 CIDR 表示法。

参考:

【讨论】:

    【解决方案2】:

    浏览 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 的回答真的很有帮助。

    【讨论】:

    • +1 干得好。我肯定会在存在(并且有效)的地方使用内置功能。但我很高兴能为您提供一些见解。
    【解决方案3】:

    前面的答案已经涵盖了从文本到 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;
    }
    

    【讨论】:

    • +1 啊,我不知道QT有这样的东西。比我的回答更直接:-)
    猜你喜欢
    • 2013-06-28
    • 2017-10-30
    • 1970-01-01
    • 2018-04-03
    • 2021-06-20
    • 2010-09-28
    • 2018-02-22
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多