Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/57: Рейтинг темы: голосов - 57, средняя оценка - 4.86
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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.07.2010, 20:43
Ответы с готовыми решениями:

Как достать из телефонной книги адреса чатов, адреса проживания и сайты
Здравствуйте, как достать из телефонной книги адреса чатов, адреса проживания и сайты. телефоны и имейлы я понял как достать, вот кусок...

Как сделать что бы данные хранились с адреса 900h а выводимые результаты с адреса 1000h?
Исходные данные хранятся в памяти с адреса 0900H, вычисление выражения производится на Ассемблере, выводимые результаты — располагаются в...

Как сравнивать время?
Добрый день! Пишу себе на работе маленькую консольную программку, которая напоминает про перерывы (по 15 минут), про обед и т.д. Так...

12
 Аватар для FireOwl
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145
25.07.2010, 11:04
но это сравнение в данном случае некорректно.
Можно воспользоваться функцией
C#
1
ip.GetAddressBytes()
которая возвращает IP-адрес в виде массива byte из четырех "звеньев". А там сравнивать уже просто по частям.
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
Да, спасибо, ваш совет полезен,
осталось придумать только, каким образом сравнивать.
Что я сейчас и делаю не спеша


А что значит этот диапазон 192,168,0,0 - 192,168,255,255? Это он такой только при определенном subnet mask!
Вероятно вы хотите определить или конкретный ip принадлежит к подсети? Но подсеть определяется её адресом (например 192,168,0,0) и маской (например 255,255,255,0).
Ну как вам сказать, конечно маска подсети есть, 192,168,0,0/19
Кто знает есть возможность в C# определять принадлежность ip-адреса
к подсети при наличии маски?
0
Эксперт С++
 Аватар для odip
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 маска не указана.
Проверяемый диапазон еще раз делится на подсети,
причем произвольным образом.

если верно выражение ( ip1 & netmask ) == ( ip2 & netmask )
вот это выражение не совсем понятно,
ip2 заведомо не будет равен ip1
так как это начало диапазона,
или я что-то не так понял?
Объясните, пожалуйста, подробнее свою мысль.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
25.07.2010, 20:35
192,168,0,0 - 192,168,255,255
В проверяемом ip маска не указана.
Как это не указана ?
Маска 255.255.0.0
C#
1
вот это выражение не совсем понятно
'&' - логическая по-битная операция 'И' в языке C
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
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
26.07.2010, 07:57
Мне не понятен смысл сравнения: ( ip1 & netmask ) == ( ip2 & netmask )
другими словами я не понял как это будет работать.
маска делит Ip-адрес на две части
там где в маске стоят '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
C#
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
public bool IsMyIP()
     {
         byte[] ipForCheck= ip1.GetAddressBytes();
         byte[] myIp1;
         byte[] myIp2;
 
         for (int i = 0; i < Program.countOfSubnets; i++)
         {
             myIp1 = Program.ipAddresses[0, i].GetAddressBytes();
             myIp2 = Program.ipAddresses[1, i].GetAddressBytes();
             if (
                 
                 //проверка на нижний предел диапазона
                 ipForCheck[0] == myIp1[0]
                 && ipForCheck[1] == myIp1[1]
                 && ipForCheck[2] >= myIp1[2]
 
                 //проверка на верхний предел диапазона
                 && ipForCheck[0] == myIp2[0]
                 && ipForCheck[1] == myIp2[1]
                 && ipForCheck[2] <= myIp2[2])
                 return true;
         }
         return false;
     }
В связи с этим можно считать вопрос закрытым.
Всем большое спасибо за участие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2010, 13:28
Помогаю со студенческими работами здесь

Как сравнивать строки?
Что-то смотрю в туториалы, но ничего не выходит. Как написать сравнение строк? add_field_to_table() { BUFFER='add_field_to_table' ...

Как сравнивать строки?
Ребят, а может вы знаете, как в этом языке сравнивать строки? походу просто string1&gt;string2 не проходит.

Как сравнивать 2 текста?
У меня есть 2 текстовых файлов.В етих файлах одиноковые слова, только в одном ети слова начинаютса с большими буквами в другой с маленькими...

Подскажите как сравнивать
Подскажите как сравнивать между собой введенные значения.(в структурах)

Как сравнивать структуры
Есть структура например struct TIME { int min; int sec; }; TIME A={10,15},B; B=A; //можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru