Всем привет если у кого есть пример или исходник как работать с диапазонами ip в дельфи поделитесь если не трудно !
Получаем список ip из диапазона ip edit1.text:=192.0.0.0-193.0.0.0 .... описание Потока Code: type TSThread = Class(TThread) private ipss:string; ips:Boolean; ipp:string; public procedure GetIPList(Str, RegStr: String); constructor Create(CreateSuspended: Boolean); protected Procedure Execute; Override; end; Форма Code: .............................. Function GetIP4ToInt(s:string;var Value:int64):boolean; Function GetListIp(adres1,adres2:string):TstringList; private { Private declarations } public ........... var form1:tform; cop,cop1:string; ipn,a1,a2:string; Lfiles :TStringList: implementation {$R *.dfm} ..................... Проверка правильности ввода айпи Code: function TForm1.Letter(const s: string): boolean; var i: cardinal; begin result := false; for i:=1 to length ( s ) do if s[i] in ['a'..'z','A'..'Z','а'..'я','А'..'Я'] then begin result := true; //exit end; end; ////// Code: function TForm1.GetIP4ToInt(s: string; var Value: int64): boolean; var b1,b2,b3,b4:int64; x:integer; s2:string; begin result:=false; try b1:=-1; b2:=-1; b3:=-1; b4:=-1; for x:=1 to length(s) do begin if (s[x]='.') or (x=length(s)) then begin if x=length(s) then s2:=s2+s[x]; if b1=-1 then b1:=strtoint(s2) else if b2=-1 then b2:=strtoint(s2) else if b3=-1 then b3:=strtoint(s2) else if b4=-1 then b4:=strtoint(s2); s2:=''; end else s2:=s2+s[x]; end; Value:=b1*256*256*256+b2*256*256+b3*256+b4; except result:=false; //StatusBar1.Panels[1].text:='Ошибка - Ip'; // exit; end; if (b1>-1) and (b2>-1) and (b3>-1) and (b4>0) and (b1<256) and (b2<256) and (b3<256) and (b4<256) then result:=true; end; Code: function TForm1.GetListIp(adres1, adres2: string): TstringList; var b1,b2,b3,b4:integer; e1,e2,e3,e4:integer; p1,p2,p3,p4:integer; x:Int64; s2,s:string; countb,counte:Int64; begin s:=adres1; s2:=''; b1:=-1;e1:=-1; b2:=-1;e2:=-1; b3:=-1;e3:=-1; b4:=-1;e4:=-1; GetIP4ToInt(adres1,countb); GetIP4ToInt(adres2,counte); begin X:=countb; while x<counte+1 do begin // sleep(50); application.ProcessMessages; s:=inttohex(x,8); p1:=strtoint('$'+copy(s,1,2)); p2:=strtoint('$'+copy(s,3,2)); p3:=strtoint('$'+copy(s,5,2)); p4:=strtoint('$'+copy(s,7,2)); if p4=0 then begin p4:=1; x:=x+1; end; Lfiles.Add(inttostr(p1)+'.'+inttostr(p2)+'.'+inttostr(p3)+'.'+inttostr(p4)); x:=x+1; end; if Lfiles.Count < 1 then begin StatusBar1.Panels[1].text:='Ошибка: Выбора Ip'; exit; end else // end; end; вызов потока Code: procedure TForm1.BitBtn1Click(Sender: TObject); const m=['a'..'z','а'..'я']; var SThread:TThread; begin Lfiles := TStringList.Create; cop:=StringReplace(Edit1.Text, ' ', '', [rfReplaceAll]);/// убираем пробелы for i:=1 to length(Edit1.Text) do if cop[i] in m then begin StatusBar1.Panels[1].text:=''; StatusBar1.Panels[1].text:='Error: Выбора Ip'; end else cop1:=cop; a1:=copy(cop1,1,pos('-',cop1)-1); a2:=copy(cop,pos('-',cop)+1,Length(cop)); SThread:=TSThread.Create(true); SThread.FreeOnTerminate:=true; SThread.Resume; o:=0; end; end; Поток Code: constructor TSThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); // ReportMemoryLeaksOnShutdown := true; end; /////////////////////// procedure TSThread.Execute; var i:integer; begin ipss:=('\b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b'); Form1.GetListIp(a1,a2); for i := 0 to Lfiles.count -1 do begin ipp:=Lfiles.Strings[i]; GetIPList(ipp,ipss); if ips = false then Lfiles.delete(i); end; end; procedure TSThread.GetIPList(Str, RegStr: String); var RE: TRegExpr; i: Integer; begin RE:=TRegExpr.Create; RE.Expression:=RegStr; if ExecRegExpr(RegStr,Str) then if RE.Exec(Str) then ips:=true; RE.Free; end; Я делаю все по отдельности (поток - (проседуры) - форма) если все ставить все в поток то большая нагрузка на проц ??? почему то...
по маске. маска это такая шляпа которая определяет что в адресе относится к адресу хоста а что к адресу сети. типично для мини сети например 255.255.255.0 - значит то что старшие 24 бита взведены в единицу, и это адрес сети, а вот младшие 8 бит типа 4.1.4.128 (октет равный 128 например)- это уже адрес хоста в этой сети. то есть в этом случае принимаются все адреса с диапазона 4.1.4.0 до 4.1.4.255 (255 - это броадкастный адрес подсети, если на него слать пакеты - то их получат все хосты с подсети)