Здравствуйте, 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>>