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プラットフォームでQtC++フレームワークを使用しています。
First you need to break up each CIDR notation range into a network (the dotted IP address) part, and a number of bits. Use this number of bits to generate the mask. Then, you only need to test if (range & mask) == (your_ip & mask)
, just as your operating system does:
Some psuedo-C code:
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.
You can probably find a library to help you with this. Boost appears to have an IP4 class which has <
and >
operators. But you'll still need to do work with the CIDR notation.
Ref:
Qtのドキュメントを調べてみると、QHostAddress :: parseSubnet(const QString&subnet)に出くわしました。これは、CIDRスタイルのIP範囲をとることができ、Qt4.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
}
問題へのより良い理解と洞察に関しては、@JonathonReinhartの答えは本当に役に立ちます。
これまでの回答では、テキストから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;
}