Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Расчет подсетей из диапазона IP-адресов / 25 сообщений из 49, страница 1 из 2
06.01.2014, 11:37
    #38518350
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Всех с наступившим Новым годом!
Уже второй день мучаюсь одной задачей, но решил уже спросить, когда все варианты закончились.
Есть произвольный диапазон IP-адресов, к примеру: 94.41.167.0-94.41.175.255, он может быть любой, но я пытаюсь вытащить из него все подсети и маски, что-то типа такого: 94.41.167.0/24, 94.41.168.0/21. Но ничего так и не получилось. Может, у кого-нибудь есть идеи? Прошу помочь. Заранее спасибо.
...
Рейтинг: 0 / 0
06.01.2014, 11:47
    #38518351
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Все - то есть включая в себя все вложенные подсети *.*.*.*/30 ?
...
Рейтинг: 0 / 0
06.01.2014, 11:51
    #38518352
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Нет, в данном конкретном диапазоне получилось только 2. В дальнейшем буду сопоставлять IP-адреса конкретному диапазону
...
Рейтинг: 0 / 0
06.01.2014, 12:06
    #38518355
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
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
какой результат должен быть ?
...
Рейтинг: 0 / 0
06.01.2014, 12:06
    #38518356
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Лично мне тогда не очень понятна задача.
То есть где-то внутри этого диапазона есть самая крупная подсеть, а ближе к краям все более мелкие, вот на это и надо разложить?
...
Рейтинг: 0 / 0
06.01.2014, 12:11
    #38518358
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
qwerty112почему 24 ?потому что следующую подсеть /23 /22 /21 можно получить только начиная с 94.41.168.*, а это либо фрагмент предыдущей подсети, либо самостоятельная сеть /24
...
Рейтинг: 0 / 0
06.01.2014, 12:12
    #38518361
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Как я понимаю, это инструмент провайдера по анализу занятых/свободных подсетей для выделения их новым клиентам.

Почти наверняка существуют уже готовые инструменты, почему бы не поискать их?
...
Рейтинг: 0 / 0
06.01.2014, 12:13
    #38518362
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
94.41.167.0/24, 94.41.168.0/21 это мне посчитал http://ip-calculator.ru/
...
Рейтинг: 0 / 0
06.01.2014, 12:15
    #38518364
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Shocker.ProПочти наверняка существуют уже готовые инструменты, почему бы не поискать их?IvanC http://ip-calculator.ru/
...
Рейтинг: 0 / 0
06.01.2014, 12:16
    #38518365
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
так мне нужно это реализовать в программе
...
Рейтинг: 0 / 0
06.01.2014, 12:18
    #38518367
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
IvanCтак мне нужно это реализовать в программеты гуглил алгоритмы?
...
Рейтинг: 0 / 0
06.01.2014, 12:24
    #38518370
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Само собой, там в основном расчет идет из условий, что известна маска. А у меня она неизвестна, и мало того, еще и переменная величина в диапазоне
...
Рейтинг: 0 / 0
06.01.2014, 12:29
    #38518372
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Но ведь ip-калькулятор работает без указания подсети. Значит алгоритмы существуют. Раз это клиентский сервис, доступный через веб, значит и алгоритмы наверняка опубликованы. Уж ончень не хочется изобретать велосипед, хотя и можно
...
Рейтинг: 0 / 0
06.01.2014, 12:38
    #38518375
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Хотя, наверное, все не так страшно
Берем твой пример

01011110 00101001 10100111 00000000

- считаем количество нулей с конца - 8
- значит маска подсети 32-8=24
- прибавляем 2^8, получаем

01011110 00101001 10101000 00000000

- считаем количество нулей с конца - 11
- значит маска подсети 32-11=21
- прибавляем 2^11, получаем

01011110 00101001 10110000 00000000

мы вышли за пределы указанного диапазона и получили две подсети.
осталось продумать, как проверять верхнюю границу каждый раз и уменьшать подсеть, пока она не будети вписываться в верхнюю границу. Справишься?
...
Рейтинг: 0 / 0
06.01.2014, 12:39
    #38518376
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
еще надо отсекать некорректные диапазоны, если требуется, то есть если получились подсети с маской /31 и /32, они могут получиться только в начале и в конце диапазона
...
Рейтинг: 0 / 0
06.01.2014, 12:51
    #38518382
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
тут есть какой-то веб-сервис, вроде по этой "теме" (я "не шарю", вдруг что :)) )
его, достаточно просто "дёргать"
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub haba()
    Const sURL = "http://dotnul.com/api/ip/94.41.167.0/24"
    '
    Dim sEnv As String
    Dim xmlhtp As Object 'MSXML2.XMLHTTP
    Dim XMLDoc As Object 'MSXML2.DOMDocument
    Dim xmlNode As Object 'MSXML2.IXMLDOMNode
    Dim texthttp As String
    '
    Set xmlhtp = CreateObject("MSXML2.XMLHTTP")
    Set XMLDoc = CreateObject("MSXML2.DOMDocument")
    '
    With xmlhtp
        .Open "GET", sURL, False
        .Send
        texthttp = .ResponseText
    End With
    Debug.Print texthttp
End Sub


возвращает результат, правда в JSONP, но его, достаточно просто можно в XML "переделать" и разобрать (или просто строковыми функциями)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
{"ipcalc":
  {"ip":"94.41.167.0",
  "ipv6":false,
  "size":256,
  "bits":"01011110001010011010011100000000",
  "network":"94.41.167.0",
  "broadcast":"94.41.167.255",
  "reverse":"0.167.41.94.in-addr.arpa"},
"error":false}
...
Рейтинг: 0 / 0
06.01.2014, 13:23
    #38518392
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
В общем, алгоритм такой, работаем в цикле с текущем значением IP в виде непрерывного числа, начальное значение - начало диапазона:

- цикл, пока IP<=конец_диапазона {
- N = количество нулей в двоичном представлении IP с конца
- Проверяем в цикле {
если IP + 2^N - 1 > конец_диапазона, то N = N - 1
}
- IP - найденная подсеть, (32 - N) - маска - выводим.
- IP = IP + 2^N
}
...
Рейтинг: 0 / 0
06.01.2014, 13:31
    #38518397
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Спасибо всем за помощь, попробую алгоритм Shocker.Pro, по результатам отпишусь
...
Рейтинг: 0 / 0
08.01.2014, 19:41
    #38519798
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Кому интересно, набросал по вышепредложенному алгоритму программу:
Код: 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.
Public Sub maask()
Public Sub maask()
Dim Add1 As String
Dim Add2 As String
Dim IP As Long
Dim y As String


IPl4 = 5
IPl3 = 142
IPl2 = 18
IPl1 = 0

IPh4 = 5
IPh3 = 142
IPh2 = 145
IPh1 = 255

Add1 = Bin(IPl3) & Bin(IPl2) & Bin(IPl1)
Add2 = Bin(IPh3) & Bin(IPh2) & Bin(IPh1)
Dec1 = Bin2Dec(Add1)
Dec2 = Bin2Dec(Add2)
IP = Dec1
x = 1

Do While IP <= Dec2
    y = Bin(IP)
            If Right(y, x) = 0 Then
            Do While Right(y, x) = 0
            x = x + 1
            Loop
            Else
            n = x
            End If
            n = x - 1
    IP = Bin2Dec(y)
    If IP + 2 ^ (n - 1) > Dec2 Then
        n = n - 1
    Else
    End If
      
    IP = IP + (2 ^ n)
    Debug.Print (32 - n)
Loop

End Sub



Работает, но не все подсети выводит. Буду думать, но победа уже где-то близко.
Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
08.01.2014, 20:23
    #38519826
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Первый серьезный косяк, бросающийся в глаза
Код: vbnet
1.
x = 1

за пределами цикла
...
Рейтинг: 0 / 0
08.01.2014, 20:31
    #38519832
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
не косяк, но строкиIvanC
Код: vbnet
1.
2.
3.
4.
            If Right(y, x) = 0 Then
           
            Else
            n = x

абсолютно бессмысленны и бесполезны, так как n все равно принимает значение x-1, то есть ветка Else ничего не делает, да и не нужна она вообще
...
Рейтинг: 0 / 0
08.01.2014, 20:33
    #38519835
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Строка
Код: vbnet
1.
   IP = Bin2Dec(y)

тоже абсолютно бессмысленна
...
Рейтинг: 0 / 0
08.01.2014, 20:35
    #38519840
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Еще один серьезный косяк
Код: vbnet
1.
2.
    If IP + 2 ^ (n - 1) > Dec2 Then
        n = n - 1

должно быть заключено в цикл - я же писал об этом. Смысл в том, чтобы урезать подсеть, пока она не уложится в диапазон.

В общем, программа работать не должнаIvanCРаботает, но
...
Рейтинг: 0 / 0
08.01.2014, 20:55
    #38519850
IvanC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Shocker.Pro,

Да, косячу я много :) Ну для стажа в полгода, я думаю, позволительно :) Для того и учимся. А про цикл, я не совсем понял, должно быть так:

Код: vbnet
1.
2.
3.
Do While IP + 2 ^ (n - 1) > Dec2
n = n - 1
Loop


?
...
Рейтинг: 0 / 0
08.01.2014, 21:19
    #38519867
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет подсетей из диапазона IP-адресов
Да, почти, но почему почему же в степени (n-1) -то????

Ты совершенно зря сначала не разобрал мой алгоритм "на бумажке", чтобы просто понять, как он работает.
Во-первых, я его просто набросал из головы, но не делал детальный просчет, то есть не исключено, что я мог допустить ошибку. Во-вторых, я не продумывал, как этот алгоритм будет обрабатывать граничные значения (например, если начало диапазона нечетное или конец диапазона четный). Я, правда, обычно в таких случаях, смотрю на поведение программы уже после реализации, тебе надо тоже не забыть это сделать.

Еще вопрос - ты умышленно не используешь старший байт IP-адреса?

Еще стоит объявить все переменные явно и использовать Option Explicit , а то тут возможно неожиданное поведение.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Расчет подсетей из диапазона IP-адресов / 25 сообщений из 49, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]