如何使用Qt确定我的互联网IP是否属于给定的IP列表
How to determine whether my internet IP belongs to a given IP list using Qt
我在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;
}
相关文章:
- 是否有一种标准化的方法通过TCP/IP网络发送JPG图像
- 检查IP是否在其他IP网络范围内,并查找下一个可用IP
- 检查 IP 第一个八位字节是否不以 127 / 224 或 255 开头
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- TCP/IP 客户端是否可以连接到无法访问的 IP
- Boost asio ip tcp iostream 是否支持异步?
- boost::asio::ip::tcp::resolver::iterator 检查值是否为空
- 如果我们只知道IP,如何知道服务器是否在线
- Boost检查是否通过UDP收到的IP地址是本地的
- 是否可以根据C/C 代码上的Linux上的(动态更改的IP地址集)丢弃传入数据包
- 如何使用Qt确定我的互联网IP是否属于给定的IP列表
- 一般来说,如何找出客户端是否分配了静态Ip或是dhcp客户端
- 如何知道 IP 地址是否在 Linux 服务器上是本地的
- 通过其 IP 地址检测服务器是否在本地运行
- 是否可以以编程方式检测 Windows XP 上特定以太网接口上的 IP 地址更改?
- 如何查找 IP 地址是否为链路本地地址
- 验证 IP 地址是否已颁发的简单方法
- 如何确定 URL 是否为 C/C++ 中的 IP 地址
- 使用inet_pton()检查给定的IP是否属于IP范围
- 是否有可能绑定和监听一个IP地址与TCP/IP套接字?(Linux / C)