Search code examples
loopsip-addressfreepascalfpc

loop through ip address pascal


In Freepascal, how can I loop through a range of IP addresses?

Any units that do ip specific stuff that might handle this? I've tried one called inetaux, but it's flawed and doesn't work.


Solution

  • As IP address is just a 32-bit number splitted into 4 bytes, you can simply iterate an integer and use for instance absolute directive to split this iterator into the 4 bytes:

    type
      TIPAddress = array[0..3] of Byte;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
      I: Integer;
      IPAddress: TIPAddress absolute I;
    begin
      // loop in some range of IP addresses, here e.g. from 127.0.0.1 to 127.0.1.245
      for I := 2130706433 to 2130706933 do
      begin
        // now you can build from that byte array e.g. well known IP address string
        S := IntToStr(IPAddress[3]) + '.' + IntToStr(IPAddress[2]) + '.' +
          IntToStr(IPAddress[1]) + '.' + IntToStr(IPAddress[0]);
        // and do whatever you want with it...
      end;
    end;
    

    Or you can do the same with bitwise shift operator, which needs a little more work to do. For instance the same example as above would look like this:

    type
      TIPAddress = array[0..3] of Byte;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
      I: Integer;
      IPAddress: TIPAddress;
    begin
      // loop in some range of IP addresses, here e.g. from 127.0.0.1 to 127.0.1.245
      for I := 2130706433 to 2130706933 do
      begin
        // fill the array of bytes by bitwise shifting of the iterator
        IPAddress[0] := Byte(I);
        IPAddress[1] := Byte(I shr 8);
        IPAddress[2] := Byte(I shr 16);
        IPAddress[3] := Byte(I shr 24);
        // now you can build from that byte array e.g. well known IP address string
        S := IntToStr(IPAddress[3]) + '.' + IntToStr(IPAddress[2]) + '.' +
          IntToStr(IPAddress[1]) + '.' + IntToStr(IPAddress[0]);
        // and do whatever you want with it...
      end;
    end;