|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Всех с наступившим Новым годом! Уже второй день мучаюсь одной задачей, но решил уже спросить, когда все варианты закончились. Есть произвольный диапазон IP-адресов, к примеру: 94.41.167.0-94.41.175.255, он может быть любой, но я пытаюсь вытащить из него все подсети и маски, что-то типа такого: 94.41.167.0/24, 94.41.168.0/21. Но ничего так и не получилось. Может, у кого-нибудь есть идеи? Прошу помочь. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 11:37 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Все - то есть включая в себя все вложенные подсети *.*.*.*/30 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 11:47 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Нет, в данном конкретном диапазоне получилось только 2. В дальнейшем буду сопоставлять IP-адреса конкретному диапазону ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 11:51 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanCВсех с наступившим Новым годом! Уже второй день мучаюсь одной задачей, но решил уже спросить, когда все варианты закончились. Есть произвольный диапазон IP-адресов, к примеру: 94.41.167.0-94.41.175.255, он может быть любой, но я пытаюсь вытащить из него все подсети и маски, что-то типа такого: 94.41.167.0/24, 94.41.168.0/21. Но ничего так и не получилось. Может, у кого-нибудь есть идеи? Прошу помочь. Заранее спасибо. почему 24 ? что вы хотите получить на этих входных данных : 94.41.167.0-94.41.175.255 какой результат должен быть ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:06 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Лично мне тогда не очень понятна задача. То есть где-то внутри этого диапазона есть самая крупная подсеть, а ближе к краям все более мелкие, вот на это и надо разложить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:06 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
qwerty112почему 24 ?потому что следующую подсеть /23 /22 /21 можно получить только начиная с 94.41.168.*, а это либо фрагмент предыдущей подсети, либо самостоятельная сеть /24 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:11 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Как я понимаю, это инструмент провайдера по анализу занятых/свободных подсетей для выделения их новым клиентам. Почти наверняка существуют уже готовые инструменты, почему бы не поискать их? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:12 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
94.41.167.0/24, 94.41.168.0/21 это мне посчитал http://ip-calculator.ru/ ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:13 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Shocker.ProПочти наверняка существуют уже готовые инструменты, почему бы не поискать их?IvanC http://ip-calculator.ru/ ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:15 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
так мне нужно это реализовать в программе ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:16 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanCтак мне нужно это реализовать в программеты гуглил алгоритмы? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:18 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Само собой, там в основном расчет идет из условий, что известна маска. А у меня она неизвестна, и мало того, еще и переменная величина в диапазоне ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:24 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Но ведь ip-калькулятор работает без указания подсети. Значит алгоритмы существуют. Раз это клиентский сервис, доступный через веб, значит и алгоритмы наверняка опубликованы. Уж ончень не хочется изобретать велосипед, хотя и можно ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:29 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Хотя, наверное, все не так страшно Берем твой пример 01011110 00101001 10100111 00000000 - считаем количество нулей с конца - 8 - значит маска подсети 32-8=24 - прибавляем 2^8, получаем 01011110 00101001 10101000 00000000 - считаем количество нулей с конца - 11 - значит маска подсети 32-11=21 - прибавляем 2^11, получаем 01011110 00101001 10110000 00000000 мы вышли за пределы указанного диапазона и получили две подсети. осталось продумать, как проверять верхнюю границу каждый раз и уменьшать подсеть, пока она не будети вписываться в верхнюю границу. Справишься? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:38 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
еще надо отсекать некорректные диапазоны, если требуется, то есть если получились подсети с маской /31 и /32, они могут получиться только в начале и в конце диапазона ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:39 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
тут есть какой-то веб-сервис, вроде по этой "теме" (я "не шарю", вдруг что :)) ) его, достаточно просто "дёргать" Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
возвращает результат, правда в JSONP, но его, достаточно просто можно в XML "переделать" и разобрать (или просто строковыми функциями) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:51 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
В общем, алгоритм такой, работаем в цикле с текущем значением IP в виде непрерывного числа, начальное значение - начало диапазона: - цикл, пока IP<=конец_диапазона { - N = количество нулей в двоичном представлении IP с конца - Проверяем в цикле { если IP + 2^N - 1 > конец_диапазона, то N = N - 1 } - IP - найденная подсеть, (32 - N) - маска - выводим. - IP = IP + 2^N } ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 13:23 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Спасибо всем за помощь, попробую алгоритм Shocker.Pro, по результатам отпишусь ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 13:31 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Кому интересно, набросал по вышепредложенному алгоритму программу: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
Работает, но не все подсети выводит. Буду думать, но победа уже где-то близко. Модератор: Учимся использовать тэги оформления кода - FAQ ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 19:41 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Первый серьезный косяк, бросающийся в глаза Код: vbnet 1.
за пределами цикла ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 20:23 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
не косяк, но строкиIvanC Код: vbnet 1. 2. 3. 4.
абсолютно бессмысленны и бесполезны, так как n все равно принимает значение x-1, то есть ветка Else ничего не делает, да и не нужна она вообще ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 20:31 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Строка Код: vbnet 1.
тоже абсолютно бессмысленна ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 20:33 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Еще один серьезный косяк Код: vbnet 1. 2.
должно быть заключено в цикл - я же писал об этом. Смысл в том, чтобы урезать подсеть, пока она не уложится в диапазон. В общем, программа работать не должнаIvanCРаботает, но ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 20:35 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Shocker.Pro, Да, косячу я много :) Ну для стажа в полгода, я думаю, позволительно :) Для того и учимся. А про цикл, я не совсем понял, должно быть так: Код: vbnet 1. 2. 3.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 20:55 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Да, почти, но почему почему же в степени (n-1) -то???? Ты совершенно зря сначала не разобрал мой алгоритм "на бумажке", чтобы просто понять, как он работает. Во-первых, я его просто набросал из головы, но не делал детальный просчет, то есть не исключено, что я мог допустить ошибку. Во-вторых, я не продумывал, как этот алгоритм будет обрабатывать граничные значения (например, если начало диапазона нечетное или конец диапазона четный). Я, правда, обычно в таких случаях, смотрю на поведение программы уже после реализации, тебе надо тоже не забыть это сделать. Еще вопрос - ты умышленно не используешь старший байт IP-адреса? Еще стоит объявить все переменные явно и использовать Option Explicit , а то тут возможно неожиданное поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:19 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Со старшим байтом overflow выбрасывает. За пределы Long выходит. В данном случае это не принципиально, так как таких больших диапазонов не будет. В любом случае спасибо Вам большое. Постараюсь на практике разобраться и, может, подправить. Еще раз спасибо. Если получится, напишу. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:25 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanCЗа пределы Long выходитСамо собой. Попробуй использовать Currency - у него целая часть принимает бОльшие значения, при этом - это точный тип. Правда, я не знаю, как с ней будут работать функции двоичных преобразований. IvanCЕсли получится, напишу.если не получится - пиши тем более ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:28 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Shocker.Pro, Пока что из всех диапазонов, которые проверил, все совпадает с интернет-калькулятором! Полет нормальный :) Спасибо! P.S.Действительно, сначала нужно разбираться, а потом слизывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:30 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Да не должно работать! По крайней мере из-за (n-1) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:31 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
А если уже все исправил - так выложи исправленную версию ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:31 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Да, с другим типом нужно будет и функции преобразования переделывать кардинально, поэтому проще так сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2014, 21:32 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Спасибо Shocker.Pro за помощь, без него вряд ли догадался бы. Ну и еще вопрос назрел: создал ACCESS базу данных, в которой планирую хранить IP адреса. Решил их записывать в целочисленном формате. Но проблема в том, что в дальнейшем нужно будет производить с ними логическое умножение. Возможно ли это производить прямо в SQL-запросе? Из того, что я прочитал и попробовал, почему-то понял, что с ACCESS такие фокусы не проходят или я ошибаюсь? И в каком формате хранить эти данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 00:22 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Что такое логическое умножение? Логическое И? Вроде бы без проблем - Поле1 & Поле2 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 00:26 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
имхо, ТС имеет в виду битовые операции в Акцессе (в Jet) они есть : band, bor, bxor но их можно использовать : - или программно, через АДО Код: vbnet 1. 2.
- или, если для БД включен синтаксис для ANSI 92, то и через интерфейс Акцесса или, если клиентская часть тоже будет в Аксцессе, можно написать пользовательские функции на ВБА и использовать их в запросах ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 01:19 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
В таблице находятся следующие записи: Код Net Mask Provider City 6 1579791360 4294966272 UfaNet Orenburg SQL запрос: SELECT IP.Provider, IP.City FROM IP WHERE IP.Net = (IP.Mask & '1579791641'); Но дает пустые поля. Может что не так сделал? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 11:32 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
во-первых почему число в кавычках? во вторых попробуйте And или BAnd для наложения маски ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 12:21 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Кавычки убрал, попробовал с AND - результат тот же - пустые поля, а на band ругается, что пропущен оператор. А из-за типа поля может быть такая проблема? я поставил числовой тип, действительное число. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 12:34 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanCдействительное число.да, конечно, числа с плавающей запятой не являются точными, нужно использовать типы с фиксированной запятой ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 12:51 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanCВ таблице находятся следующие записи: Код Net Mask Provider City615797913604294966272UfaNetOrenburg SQL запрос: SELECT IP.Provider, IP.City FROM IP WHERE IP.Net = (IP.Mask & '1579791641'); Но дает пустые поля. Может что не так сделал? а что вот это за "приколы" (выделил), которые в 4-е байта и не влазят-то ? ты как 4-х байтные тетрады ИП и маски переводил в целое число ? вот это вот твоё - "Решил их записывать в целочисленном формате" - как сделал ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 13:01 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
"длинное целое", как написано в access имеет предел 2 147 483 647, хоть подсеть и влезает в этот предел, но маска не укладывается. Перевод туда и обратно осуществляется функцией, там тип Variant, поэтому проблем не встречаю. Сейчас вставил в таблицу вместо маски и сети "1", также вместо проверяемого адреса поставил "1", 1 AND 1 = 1, но запрос все так же не отрабатывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 18:57 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanC1 AND 1 = 1,а так (1 AND 1) = 1 приоритет операции сравнения выше, чем битовой (кажется) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 22:34 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
Оказывается, на самом деле в запросе Access эти фокусы не прокатывают, подключил базу в среде VBA через Microsoft.ACE.OLEDB.12.0, где и сработал BAND, но снова проблема. Не работает почему-то BAND с этими числами. Переполнение возвращает. Неужели придется разбивать IP адреса на части? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 23:03 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
авторНеужели придется разбивать IP адреса на части? ТС, "открой мне глаза", скажи какой ИП и какую маску ты "представил" в виде этих целых чисел - 1579791360 и 4294966272 покажи эти ИП и маску - тетрадами , потом вместе над тобой посмеёмся ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 23:09 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
94.41.180.0 255.255.252.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 23:11 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanC94.41.180.0 255.255.252.0 с первым - понятно а для 255.255.252.0 - "левое" значение Код: vbnet 1. 2. 3. 4. 5.
соответственно их побитовое произведение Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 23:23 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
а почему маска отрицательная получилась? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 23:43 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
IvanCа почему маска отрицательная получилась? потому что эта твоя маска не количество хз чего, а всего лишь то, как храниться число с типом Long , которое в 16-ричной форме записываеться как FFFFFC00 а у Long - первый бит - определяет знак числа вот тебе для размышлений Код: vbnet 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2014, 23:59 |
|
Расчет подсетей из диапазона IP-адресов
|
|||
---|---|---|---|
#18+
кстате, если "пугают" отрицательные дес.числа, то можно просто всё хранить в 16-ричных, прийдёться, правда всё время "морочиться" с преобразованиями, но сами значения, конечно по-наглядней будут ... Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2014, 00:05 |
|
|
start [/forum/topic.php?all=1&fid=60&tid=2156583]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
others: | 286ms |
total: | 445ms |
0 / 0 |