Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Системное программирование > вычисления по методу ipcalc |
Автор: ISQman 29.7.2008, 10:58 | ||
имеем список ip c масками:
нужно по принципу ipcalc проверить принадлежность данных ip к их подсети, и если да, то удалить данный ип. Вопрос заключается в реализации, т.к. не разобрался в коде ipcalc заранее благодарю за ответы. |
Автор: ginnie 29.7.2008, 11:26 |
Уважаемый ISQman, я, наверное, что-то не понимаю: как IP-адрес может не принадлежать подсети в Вашем условии, ведь подсеть определяется на основе этого IP-адреса? |
Автор: ISQman 29.7.2008, 11:58 |
в данном случае приходится сильно ухищряться, т.к. это взято из анонса, который делали ногами, как видно выше есть ипы такого плана: 195.114.128.0/19 195.114.128.0/24 в данном случае маска присваивается верхнему значению. так же и для всех его подсеток. путём листа и ручки а также для ускорения калькулятора в руках это вычислить не сложно, и будет видно, что: 195.114.128.0/19 195.114.128.0/24 195.114.129.0/24 195.114.130.0/24 195.114.131.0/24 195.114.132.0/24 195.114.133.0/24 195.114.135.0/24 будут все иметь маску /19 и естественно я их удалю руками (ipcalc вычисляет чётко)про действия могу сказать так: достаточно присвоить всем нижним подсеткам маску /19 и нетворк будет равен верхнему. При выполнении данного условия остаться должень только тот ип, который и является нетворком (195.114.128.0/19), ну и так по всему списку ![]() (ЗЫ описал тему как сам понял, может чтото упустил) |
Автор: amg 29.7.2008, 14:13 | ||
Удалить все подсетки, целиком входящие в другие подсетки?
|
Автор: ginnie 29.7.2008, 14:38 |
Уважаемый amg, менять массив внутри цикла по нему разве хороший стиль? |
Автор: ISQman 29.7.2008, 15:08 |
менять массивы и тд тут не выход из положения.. отбор осуществляться должен путём подобного сравнения Address: 195.114.128.0 11000011.01110010.100 00000.00000000 Netmask: 255.255.224.0 = 19 11111111.11111111.111 00000.00000000 Wildcard: 0.0.31.255 00000000.00000000.000 11111.11111111 => Network: 195.114.128.0/19 11000011.01110010.100 00000.00000000 Address: 195.114.129.0 11000011.01110010.1000 0001.00000000 Netmask: 255.255.240.0 = 20 11111111.11111111.1111 0000.00000000 Wildcard: 0.0.15.255 00000000.00000000.0000 1111.11111111 => Network: 195.114.128.0/20 11000011.01110010.1000 0000.00000000 Address: 195.114.129.0 11000011.01110010.100 00001.00000000 Netmask: 255.255.224.0 = 19 11111111.11111111.111 00000.00000000 Wildcard: 0.0.31.255 00000000.00000000.000 11111.11111111 => Network: 195.114.128.0/19 11000011.01110010.100 00000.00000000 в данном случае нетворком является один и тот же адрес. отсюда вопрос как данное сравнение организовать на perl? с учетом того, что при совпадении нетворков нижнее значение должно удаляться, также не факт что в списке будут присутствовать маски /20 и /19... |
Автор: ginnie 29.7.2008, 15:16 |
Уважаемый ISQman, напишите, что неверно делает вариант, предложенный amg? |
Автор: ISQman 29.7.2008, 15:51 | ||
я так понял что в вышеизложенном коде фрагмент
яавляется не совсем удобным т.к. считывание значений будут из файла или из массива и по истичению какогото времени эти значения будут меняться :( если я чтото пишу не так, будьте так добры поправьте... |
Автор: ISQman 29.7.2008, 18:09 |
попробовал использовать данный amg, скрипт, он либо выводи 1 ип, либо не фильрует вообще не пойму по какой причине... |
Автор: ginnie 29.7.2008, 18:19 |
Уважаемый ISQman, скрипт в студию. |
Автор: gcc 29.7.2008, 18:35 | ||
меняться ничего не должно! если я праивльно понял, то в подсетях мастка может быть левая? вот еще скрипт я где-то давно нашел, работает на BSD!
|
Автор: ginnie 29.7.2008, 18:40 |
Уважаемый gcc, не подскажите, как может быть левой маска, указанная в виде /xx? |
Автор: gcc 29.7.2008, 18:45 |
Уважаемый ginnie, ну эти маски беруться наверное с маршрутизаторов...? и в списке сетей офицальном на моем провейдере админы вывесили подсети с неправильными масками ![]() или я не понял суть вопроса автора топика? ![]() |
Автор: amg 30.7.2008, 07:25 | ||||
open F, 'file'; @IP = <F>; -- получить его из файла Я в растерянности... Если менять данные (массивы) нельзя (не выход из положения), то и делать ничего не нужно?
Покажите, пожалуйста, что должно получиться, например, из данных, приведенных в 1-м посте. |
Автор: ISQman 30.7.2008, 09:22 | ||||
вот от этой криворукости и мы страдаем, в общем вот код, где небыло маски вообще я добавлял /24
чуть не забыл работаю под фряхой имхо винда сакс |
Автор: ISQman 31.7.2008, 17:33 |
наверное всётаки никто не сталкивался с таким гемором... тогда такой вопорс, как ещё проверить вхождения подсеток? |
Автор: ginnie 31.7.2008, 17:43 | ||
ISQman, если честно, я из Ваших пояснений так и не понял задачу, которую надо решить. Про вхождение подсеток amg, решение уже привел. Вам, вероятно, надо что другое, но вот что - не понятно! Присоединяюсь к просьбе amg
|
Автор: ISQman 31.7.2008, 18:56 |
глубоко извиняюсь покурил мануальчики, и всё стало на свои места amg и ginnie, Вы просто чудо а не люди))) СЫПЫСЫ вам от чистого сердца ![]() ![]() великие шаманы программирования ![]() |
Автор: ISQman 20.8.2008, 11:29 | ||||
Всё чудесно, только вот вопрос каким таким чудесным образом вывод получается такого вида? 212.40.60/24 213.155.0/19 213.231.0/18 т.е ип теперь состоит из 3-х "частей" а не из 4-х |
Автор: ISQman 27.10.2009, 18:48 |
а есть ли альтернатива данному способу? т.к. при переборе фул вью на более чем 2к подсетей роутер уходит в раздумие минут на 10... |
Автор: amg 28.10.2009, 08:56 |
Если под "данным способом" Вы имеете в виду тот код, который я приводил где-то в начале, то первое, что приходит в голову -- это переписать тот дурацкий цикл, который совершенно справедливо критиковал ginnie. Возможно, будет ускорение, м.б. даже в разы. Дальнейшее ускорение -- это уже нужно менять алгоритм и/или используемый модуль. Возможно, сначала отсортировать список и очевидные случаи удалить сразу ... И кстати, на отсортированном списке при условии "правильного" цикла (который не тупо перебирает все подряд, а делает выход, как только обнаруживает совпадение) даже без удаления "в ручную" очевидных случаев программа будет работать быстрее (возможно, сильно быстрее). |
Автор: ISQman 28.10.2009, 12:10 | ||
цикл я переписал сразу, а счас просто ищу вот тот самый алгоритм/модуль, который будет работать быстрее... идея на данный момент есть, например, ключами для начала использовать глые ипы без маски, а значения будут масками, таким образом я хоть смогу отсеять часть дубликатов (параллельно проверять маски и оставльять наименшую)... кстати есть ещё идея и вот как раз с ней я никак не могу подружиться в плане кода: можно подсети сравнить побитово (благодаря маске), но как правильна побитово разложить увы я так и не понял, да и как сравнить. допустим есть 172.16.0.0/15 минимальный ип будет 172.16.0.1 бродкаст - 172.17.255.255 в данном случае все подсети аля 172.17.0.0/24 172.16.0.0/24 должны отсеятся (если таковы имеются в списке) и т.д. пока реализовую первую задумку вот что наковырял:
ключами являются ипы, значения - маски втолько остался вопрос стоит ли сливать в подсетки... |