• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2003
  • Last Modified:

IP adreses calc from subnet mask

How to write procedure where I can from example 192.168.0.0/24 get all IP adress 192.168.0.1- 192.168.0.255 into stringlist. where is mask is 24 there is simple but how to make where ip with mask is 213.21.192.0/18 or 192.168.0.30/28
0
KarlisB
Asked:
KarlisB
  • 5
  • 2
1 Solution
 
KarlisBAuthor Commented:
Maybe someone can give procedure to make like :
http://www.aboutmyip.com/AboutMyXApp/SubnetCalculator.jsp?ipAddress=192.168.0.0&cidr=20

and calculate first IP address and last IP address
0
 
ahalyaCommented:
I am not conversant in IP traffic, but it appears the number after the slash shows you the number of bit to turn on in the mask.

16 -> Mask: 255.255.0.0
17-> Mask: 255.255.128.0

I'll try to implement an algorithm to give you a list. (Correct me if my interpretation is wrong).

0
 
ahalyaCommented:
Here is the code to list the IP in tha range given the IP & the mask bits.  I have simply used logical operands to expand the list.

Call the 'GetIPList' function with two arguments: IP-v4 address, and the MaskBits.

e.g., GetIPList('192.168.0.0', 22);


type TIPSegments = array[1..4] of byte;
 
function NumberToSegments(Number:longword):TIPSegments;
 
var j : 0..4;
 
begin;
  for j := 4 downto 1 do
  begin;
    result[j] := Number mod 256;
    Number := Number div 256;
  end;
end;
 
function IPToSegments(ip:string):TIPSegments;
 
var i : byte;
    j : 0..4;
    s : string;
 
begin;
  for j := 1 to 4 do
  begin;
    i := pos('.', ip);
    if j < 4 then s := copy(ip, 1, i-1) else s := ip;
    delete(ip, 1, i); //remove '.'
    result[j] := StrToInt(s);
  end;
end;
 
 
function IPToNumber(ip:string):longword;
 
var segment : TIPSegments;
    i : 1..4;
 
begin;
  segment := IPToSegments(ip);
  result := 0;
  for i := 1 to 4 do
    result := result * 256 + segment[i];
end;
 
function NumberToIP(Number:longword):string;
 
var segment : TIPSegments;
    i : 1..4;
 
begin;
  result := '';
  segment := NumberToSegments(Number);
  result := Format('%d.%d.%d.%d', [segment[1], segment[2], segment[3], segment[4]]);
end;
 
 
procedure TForm4.GetIPList(IPStr:string; MaskBits:byte);
 
var
  IP   :LongWord;
  i, w : longword;
 
begin;
  IP := IPToNumber(IPStr);
 
  WildCard := 1 shl (32 - MaskBits) - 1;
  NetMask := not WildCard;
 
  leWildCard.text := NumberToIP(WildCard);
  leNetMask.text  := NumberToIP(NetMask);
 
  ListBox1.Items.Clear;
  for w := 1 to WildCard - 1 do
  begin;
    i := IP or w;
    ListBox1.Items.Add(NumberToIP(i));
  end;
  leCount.text    := IntToStr(ListBox1.Items.Count);
end;

Open in new window

0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
ahalyaCommented:
by the way, it appears that you'd need a Stringlist with duplicates set to dupIgnore, instead of a ListBox to make this work for any generic IP address.

0
 
KarlisBAuthor Commented:
please give what type of variables is:

Wildcard
NetMask
IeWildcard

bacause I have:

[Error] Unit2.pas(106): Undeclared identifier: 'WildCard'
[Error] Unit2.pas(107): Undeclared identifier: 'NetMask'
[Error] Unit2.pas(109): Undeclared identifier: 'leWildCard'
0
 
ahalyaCommented:
Type for WildCard and NetMask is LongWord.  Anything where name starts with le* is just a TEdit which I used to display the calculated value.

Just to give a quick comment about what I am doing:

1. Convert the IP address in to an integer (There are four 'segments' each going from 0 to 255, i.e. 8 bits. so you need a total of 32 bits hence the LongWord  -for IP-v4)

2. WildCard is an integer correspoding to the Mask.

3. NetMask is the (binary) inverse of the WildCard which has to be 'Logical-OR'ed with the original IP to get the list.



0
 
ahalyaCommented:
My wording isn't clear above:

2.  WildCard corresponds to the number of bits in the Mask, and that is the one you have to "Logical-OR' with the IP to get the list.

3.  NetMask is the binary inverse of WildCard, and gives you the 'SubNet Mask' in the traditional form (e.g. 255.255.255.0).
0

Featured Post

[Webinar] Kill tickets & tabs using PowerShell

Are you tired of cycling through the same browser tabs everyday to close the same repetitive tickets? In this webinar JumpCloud will show how you can leverage RESTful APIs to build your own PowerShell modules to kill tickets & tabs using the PowerShell command Invoke-RestMethod.

  • 5
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now