Как определить, принадлежит ли мой интернет-IP данному списку IP-адресов с помощью Qt

У меня есть следующий список 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.

5

Решение

Сначала необходимо разбить каждый диапазон нотации 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:

8

Другие решения

Проходя по документации 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 действительно полезен.

6

Предыдущие ответы уже охватывали преобразование из класса в класс 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;
}
5
По вопросам рекламы [email protected]