Delphi как работать с диапазонами ip ?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by triblekill, 13 Jun 2018.

  1. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Всем привет если у кого есть пример или исходник как работать с диапазонами ip в дельфи поделитесь если не трудно !
     
  2. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    Получаем список 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;
    Я делаю все по отдельности (поток - (проседуры) - форма) если все ставить все в поток то большая нагрузка на проц ??? почему то...
     
    #2 vasykas, 13 Jun 2018
    Last edited: 13 Jun 2018
    triblekill likes this.
  3. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    по маске. маска это такая шляпа которая определяет что в адресе относится к адресу хоста а что к адресу сети. типично для мини сети например 255.255.255.0 - значит то что старшие 24 бита взведены в единицу, и это адрес сети, а вот младшие 8 бит типа 4.1.4.128 (октет равный 128 например)- это уже адрес хоста в этой сети. то есть в этом случае принимаются все адреса с диапазона 4.1.4.0 до 4.1.4.255 (255 - это броадкастный адрес подсети, если на него слать пакеты - то их получат все хосты с подсети)
     
    CKAP likes this.