[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1974
  • 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
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

Upgrade your Question Security!

Add Premium security features to your question to ensure its privacy or anonymity. Learn more about your ability to control Question Security today.

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