Re: Поиск вхеждения IP в массив подсетей (CIDR)
От: OdesitVadim Украина  
Дата: 03.10.08 17:58
Оценка: 3 (1) +1
Здравствуйте, raptor.player, Вы писали:

RP>Всем привет. Сижу уже неделю с такой задачей:


RP>Есть массив подсетей (CIDR-блоков) вида: 123.123.123.123/24


RP>Первый вопрос:

RP>Можно ли на C++, без использования inet-функций (т.е. своя реализация) проверять IP на вхождение в массив подсетей.
RP>Если можно — подскажите пожалуйста как. Или ткните в пример.

RP>Второй вопрос:

RP>Можно ли ускорить проверку по массиву? Например реализовать массив лонгов и проходом сравнить?

RP>Заранее спасибо за любую помощь.

Любая маска завершается на нули. разщифровуется эта запись так «IP-адрес/количество единичных бит в маске слева». А справа у нас нули.
Теперь как сравнивать. Пусть у нас есть функция long maska(int i), которая по числу формирует эту самую маску. Например
maska(24) = 0xFFFFFF00 (я пишу в хексом, что бы короче было).
перевести ip адрес в беззнаковое целое 4байтовое думаю не проблема. А теперь последний шаг — сравнение. пусть ips и ipc адрес сети и компа и m их маска, тогда
if ((ips & maska(m)) == (ipc & maska(m))) { printf("Входит");}

правда, если адрес сети в маске записан правильно (а в вопросе он неверно написан), то можно и ещё коротче записать
if (ips == (ipc & maska(m))) { printf("Входит");}

осталось написать реализацию функции

Но можно ещё быстрее
if ((ips >> (32 - m)) == (ipc >> (32 - m))) 
  { printf("Входит");}

код конечно лучше на примерах оттестить, а то мог единичку где то забыть
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.