|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 19
|
|
Как сравнивать ip-адреса (+)24.07.2010, 20:43. Показов 12468. Ответов 12
Метки нет (Все метки)
Всем привет!
В общем задача у меня стоит такая: есть список диапазонов ip-адресов, напрмер: 192,168,0,0 - 192,168,255,255 а также есть список ip которые нужно проверить на принадлежность к заданному диапазону. Проверяемый IP реализован как тип System.Net.IPAdreress Диапазон реализован в виде массива IPadress[2, countOfSubnets] Я сначала начал делать интуитивно - сравнивать типы следующим образом ip.Address>ip2.Address но это сравнение в данном случае некорректно. Кто нибудь может подсказать как сделать корректно в соответствии с задачей?
0
|
|
| 24.07.2010, 20:43 | |
|
Ответы с готовыми решениями:
12
Как достать из телефонной книги адреса чатов, адреса проживания и сайты Как сделать что бы данные хранились с адреса 900h а выводимые результаты с адреса 1000h? Как сравнивать время? |
|
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145
|
|||||||
| 25.07.2010, 11:04 | |||||||
1
|
|||||||
|
2 / 2 / 0
Регистрация: 25.07.2010
Сообщений: 18
|
|
| 25.07.2010, 17:14 | |
|
А что значит этот диапазон 192,168,0,0 - 192,168,255,255? Это он такой только при определенном subnet mask!
Вероятно вы хотите определить или конкретный ip принадлежит к подсети? Но подсеть определяется её адресом (например 192,168,0,0) и маской (например 255,255,255,0).
0
|
|
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 19
|
||
| 25.07.2010, 17:59 [ТС] | ||
|
FireOwl
Да, спасибо, ваш совет полезен, осталось придумать только, каким образом сравнивать. Что я сейчас и делаю не спеша ![]()
Кто знает есть возможность в C# определять принадлежность ip-адреса к подсети при наличии маски?
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
| 25.07.2010, 18:50 | |
|
перевести ip-адреса в ulong, перевести маску в ulong
два ip-адреса лежат в одной подсети если верно выражение ( ip1 & netmask ) == ( ip2 & netmask )
0
|
|
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 19
|
||
| 25.07.2010, 19:52 [ТС] | ||
|
В проверяемом ip маска не указана.
Проверяемый диапазон еще раз делится на подсети, причем произвольным образом.
ip2 заведомо не будет равен ip1 так как это начало диапазона, или я что-то не так понял? Объясните, пожалуйста, подробнее свою мысль.
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|||||||
| 25.07.2010, 20:35 | |||||||
Маска 255.255.0.0
1
|
|||||||
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 19
|
|
| 25.07.2010, 23:27 [ТС] | |
|
odip
Да, по диапазону конечно можно вычислить маску, в моем конкретном случае маска = 255.255.224.0 т.е. ip-адреса от 192.168.0.0 до 192.168.31.255 То, что && это операция "И" я знаю ![]() Мне не понятен смысл сравнения: ( ip1 & netmask ) == ( ip2 & netmask ) другими словами я не понял как это будет работать. Если не трудно, объясните, пожалуйста. Добавлено через 15 минут Тот айпи, который проверяется на принадлежность к данному диапазону идет без маски. а айпишников там целая куча (несколько тысяч). И только некоторая часть принадлежит заданному диапазону. Поэтому можно считать, что у нас задана подсеть вместе с маской. Или можно считать что у нас есть диапазон - это не критично, критично, то чтобы с наименьшими затратами определить входит ip в заданную подсеть или нет. Так же необходимо учитывать, что подсеть не одна, а есть несколько совсем других подсетей, например: 192,245,96,0/19 (255,255,224,0). И соответственно эти подсети есть в конфигурационном файле приложения. Т.е. они могут в любой момент изменится. Т.е. хардкодинг исключается автоматически, нужен какой-нибудь универсальный гибкий подход.
0
|
|
|
2 / 2 / 0
Регистрация: 25.07.2010
Сообщений: 18
|
|
| 25.07.2010, 23:28 | |
|
Вообщем, например дана подсеть 192,168,0,0/28 Нужно проверить или 192,168,0,93 находиться в подсети.
Считаем: сеть нашу нужно написать в двоичном виде (десятичное представление обманчиво) 11000000.10101000.00000101.00000000 Только последние четыре бита могут меняться. Напишем наш ip в двоичном виде 11000000.10101000.00000101.01011101 Мы видим что единички "портят всю кашу" ) Вывод: что бы определить принадлежность адреса к подсети нужно убедиться что биты подсети у ip адреса остались неизменны. P.S. Есть еще over9000 способов )
0
|
|
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 19
|
|
| 25.07.2010, 23:57 [ТС] | |
|
И вот, что еще забыл добавить,
аналогичной функцией (ip-фильтр) обладает torrent-клиент uTorrent. Т.е. если эта функция включена, то можно разрешить скачивание файлов только для определенных сетей. Добавлено через 5 минут Lexa83, ок, ваш ход мысли понятен, остается вопрос: третий сегмент, тоже же меняется, и третий сегмент, в отличии от четвертого, мы не можем так просто идентифицировать способом "портит кашу" ![]() Так как он меняется и какие-то значения он может принимать, а какие-то нет (в смысле какие-то цифры попадают в диапазон а какие-то нет) Ладно утро вечера мудренее. Может, что во сне приснится ![]() Но я все еще жду ваши варианты
0
|
|
|
2 / 2 / 0
Регистрация: 25.07.2010
Сообщений: 18
|
|
| 26.07.2010, 00:06 | |
|
Нету никаких сегментов, точки поставлены только для удобочитаемости.
Просто тупо смотрим что биты подсети неизмены и всё )
0
|
|
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|||
| 26.07.2010, 07:57 | |||
там где в маске стоят '1', то на соответствующем месте в Ip-адресе стоит адрес подсети там где в маске стоят '0', то на соответствующем месте в Ip-адресе стоит адрес хоста в подсети ip1&netmask => обнуляет адрес хоста в подсети, то есть адрес хоста равен 0 после обнуления остается чистый адрес подсети аналогично ip2&netmask после чего мы можем просто сравнивать два адреса подсети если они равны, то ip-ники лежат в одном подсети если не равно, то ip-ники не лежат не в одной подсети почитай устройство TCP-IP что-ли Добавлено через 56 секунд
Про '&&' я ничего не говорил
0
|
|||
|
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 19
|
||||||
| 26.07.2010, 13:28 [ТС] | ||||||
|
В общем всем спасибо за советы, они мне очень помогли - так или иначе,
проблему решил, наверное одним из самых простых способов, пусть и не самым изящным ![]() Обошелся поверхностными знаниями TCP/IP ![]()
Всем большое спасибо за участие.
0
|
||||||
| 26.07.2010, 13:28 | |
|
Помогаю со студенческими работами здесь
13
Как сравнивать строки? Как сравнивать строки? Как сравнивать 2 текста?
Как сравнивать структуры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|