У меня есть следующий список IP-адресов (в формате CIDR), хранящийся в файле TXT:<
58.200.0.0/13
202.115.0.0/16
121.48.0.0/15
219.224.128.0/18
...
Но я не знаю, как я могу определить, принадлежит ли мой IP этому списку. Я использую фреймворк Qt C ++ на платформе Windows.
Сначала необходимо разбить каждый диапазон нотации 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.
Вы можете, вероятно, найти библиотеку, чтобы помочь вам с этим. Boost, кажется, имеет Класс IP4 у которого есть <
а также >
операторы. Но вам все равно придется работать с нотацией CIDR.
Ref:
Проходя по документации Qt, я наткнулся на QHostAddress :: parseSubnet (const QString & подсеть), которая может принимать диапазон IP-адресов в стиле CIDR и является новой в 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 (). Возвращается значение true, если ваш IP-адрес находится в пределах указанного адреса и маски.
Например, вот пример, который проверяет, является ли 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;
}