Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Модуль работы с IP сетями. [D7, WinXP]


ГореПрограммер ©   (2006-10-17 18:44:00) 

Здравствуйте.
Возможно тко- то уже сталкивался. Может есть у кого- нибудь модуль работы с IP адресами и масками ? вот примерный список требований:
пересчет масок в битовые и обратно
опредлеение принадлежности адреса к сети
операции с сетиями (складывание, вычитание)
определение адресов подсетей и броткастов.
....


ГореПрограммер   (2006-10-19 18:48:00) [1]

Вопрос такой, корректна ли данная функция перевода битовой маски в обычную ? т.е. результат то она правильный выдает, а вот со стороны кода ?
var ic,ic1,i:integer;
   iss,res:string;
begin
ic:=4294967295;
ic1:=round(power(2,(32-strtoint(t2.text)))-1);
ic:=ic-ic1;
iss:=inttohex(ic,8);
res:='';
for i:=1 to 4 do
begin
res:=res+inttostr(strtoint('$'+copy(iss,1,2)))+'.';
iss:=copy(iss,3,length(iss)-2);
end;
res:=copy(res,1,length(res)-1);


ГореПрограммер   (2006-10-19 15:03:00) [2]

Еще было бы для примера очень полезна функция, возвращающая массив строк, состоящий из IP адресов сети, пример:
func (10.1.1.16/32)=[10.1.1.17,10.1.1.18]


ГореПрограммер   (2006-10-19 15:00:00) [3]


> > пересчет масок в битовые и обратно
>
> Для этого модуль не нужен... и пересчитывать ничего не нужно.
> ... всего лишь двоичное представление числа.

Не совсем двоичное. От простого двоичного представления числа 32 вам вряд ли станет понятно что это маска 255.255.255.255

> > опредлеение принадлежности адреса к сети
> Что понимается под сетью? Как она, по вашему, задается?
> Иными словами, какие входные параметры вы видете у этой
> процедуры?

Сеть: 10.1.1.16/30   Соответственно передав процедуре сеть и некий IP 10.1.1.119 кпримеру, процедура должна вернуть true или false в зависимости от того принадлежит этот адрес сети или нет.

> > операции с сетиями (складывание, вычитание)
> Долго думал, что это такое... не могли бы дать ссылку на
> теоретический материал по этой теме....

Я же описал в этой теме на примере:
10.1.1.16/30 + 10.1.1.20/30 =10.1.1.16/29,
т.е.
10.1.1.16/255.255.255.252+10.1.1.20/255.255.255.252=10.1.1.16/255.255.255.248
Вроде как логичн ои понятно

> > определение адресов подсетей и броткастов.
> Адрес подсети? Опять же... какие входные и выходные параметры
> должны быть у этой процедуры?   Броадкаст? Сделать такую
> функцию - минут 5... смотрим по маске какие биты, являются
> адресом хоста, и если все они равны 1, то IP-адрес - броадакст.
> .. Если, конечно, вопрос был про broadcast уровня IP :)

Я и не утверждаю что это сложно ) передав процедуре сеть 10.1.1.16/30 процедура должна вернуть соответственно адрес подсети : 10.1.1.16 и адрес бродкаста: 10.1.1.19 )


YurikGL   (2006-10-18 22:09:00) [4]


> пересчет масок в битовые и обратно

Для этого модуль не нужен... и пересчитывать ничего не нужно.... всего лишь двоичное представление числа.


> опредлеение принадлежности адреса к сети
Что понимается под сетью? Как она, по вашему, задается? Иными словами, какие входные параметры вы видете у этой процедуры?


> операции с сетиями (складывание, вычитание)
Долго думал, что это такое... не могли бы дать ссылку на теоретический материал по этой теме....


> определение адресов подсетей и броткастов.
Адрес подсети? Опять же... какие входные и выходные параметры должны быть у этой процедуры?   Броадкаст? Сделать такую функцию - минут 5... смотрим по маске какие биты, являются адресом хоста, и если все они равны 1, то IP-адрес - броадакст... Если, конечно, вопрос был про broadcast уровня IP :)


kay   (2006-10-18 20:46:00) [5]

вот, то, что у меня есть:
function StrToIP(const IpString1:string):DWORD;
var
 i:integer;
 IpString:string;
 Dip:DWORD;
begin
 IpString:=IpString1+'.';
 Dip:=0;
 for i:=0 to 3 do
   begin
     Dip:=Dip or (WORD(StrToInt(Copy(IpString,0,Pos('.',IpString)-1))) shl (8*i));
     Delete(IpString, 1, Pos('.',IpString));
   end;
 StrToIP:=Dip;
end;

function IPToStr(const Dip:DWORD):string;
begin
 IPToStr:=IntToStr((Dip shl 24) shr 24)+'.'+
          IntToStr((Dip shl 16) shr 24)+'.'+
          IntToStr((Dip shl 8) shr 24)+'.'+
          IntToStr((Dip shl 0) shr 24);
end;

вот преобразование маски сети в читабельную:
     tmp:=$FFFFFFFF shl (32-StrToInt(mask.Strings[i]));
     mask1.Add(IntToStr((tmp shl 0) shr 24)+'.'+
               IntToStr((tmp shl 8) shr 24)+'.'+
               IntToStr((tmp shl 16) shr 24)+'.'+
               IntToStr((tmp shl 24) shr 24));

mask1:TStringList;


ГореПрограммер   (2006-10-18 13:08:00) [6]

Я же написал в первом посте.


kay   (2006-10-18 13:00:00) [7]

тебе процедура нужна, которая IP с маской в формате DWORD переводит в текстовы и наоборот?


ГореПрограммер   (2006-10-18 11:06:00) [8]

10.1.1.1/30 это сеть, 10.1.1.1 это адрес.
Если следовать вашей логике, то получается следующее:
выражение 10.1.1.16+10.1.1.17 имеет смысл  (что бред в корне), а выражение 10.1.1.16/30+10.1.1.20/30 не имеет смысла (что на самом деле наоброт).
Массив сетей это, предположим, некий вектор строковых значений вида XXX.XXX.XXX.XXX/XX , либо с обычной маской через пробел.  , каждый из таких видов записей является сетью, с которыми и можно и нужно производить некие операции.


Сергей М.   (2006-10-18 10:56:00) [9]


> ГореПрограммер   (18.10.06 10:41) [9]


> что такое маски я знаю


Еще бы ты пояснил, что такое "массив сетей" и "складывание, вычитание сетей".

Массив IP-адресов - это еще можно понять, логические/арифметические операции над этими адресами - это тоже можно понять, но "массив сетей" и "складывание, вычитание сетей" - это нонсенс.


ГореПрограммер   (2006-10-18 10:41:00) [10]

И что ?
что такое маски я знаю и таблица соответствия вещь далеко не новая. Вы мой вопрос читали ?


Rouse_   (2006-10-18 10:22:00) [11]

http://www.hub.ru/modules.php?name=Pages&op=showpage&pid=45


ГореПрограммер   (2006-10-17 19:02:00) [12]

первая задача пришелшая на ум:
есть массив сетей, необходимо проверить, предположим, "заполненность" С сети.
самый просто вариант это складывание имеющегося массива для проверки на выходе наличия 24-й маски.
Это самое простое что только что пришло в голову, подобных задач великое множество.


Ketmar   (2006-10-17 18:52:00) [13]

раскроите мне череп, но всё равно не понимаю. господа, сведущие в сетях: это вообще имеет какой-нибудь смысл???


ГореПрограммер   (2006-10-17 18:50:00) [14]

10.1.1.16/29


kay   (2006-10-17 18:49:00) [15]

а что в итоге должно получиться?


Ketmar   (2006-10-17 18:48:00) [16]

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


ГореПрограммер   (2006-10-17 18:47:00) [17]

10.1.1.16/30+10.1.1.20/30


Ketmar   (2006-10-17 18:45:00) [18]

>[0] ГореПрограммер 17-Oct-2006, 18:44
>операции с сетиями (складывание, вычитание)
это как, пардон???


Наверх

Титульная страница Поиск, карта сайта Написать письмо