Toon posts:

[delphi] lijst maken van IP's binnen range

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

Ik probeer al dagen het volgende voor elkaar te krijgen:

Ik wil een programma maken waaarbij ik een startIP en een eindIP ingeef. Vervolgens dient dit programma alle tusseliggende IP's in een lijst weer te geven.

bv
StartIP: 10.0.0.1
EindIP: 10.0.0.254

Lijst:
10.0.0.1
10.0.0.2
10.0.0.3
..........
enz


Ik moet dus eigenlijk een teller hebben voor IP-adressen. Het leek me daarom zinvol om het start en eindIP eerst te converteren naar een LongInt. Hiervoor heb ik de volgende code inmiddels geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function IpToLong(ip: string): Longint;
var
  x, i: Byte;
  ipx: array[0..3] of Byte;
  v: Integer;
begin
  Result := 0;
  Longint(ipx) := 0;
  i := 0;
  for x := 1 to Length(ip) do
    if ip[x] = '.' then
    begin
      Inc(i);
      if i = 4 then Exit;
    end
  else
  begin
    if not (ip[x] in ['0'..'9']) then Exit;
    v := ipx[i] * 10 + Ord(ip[x]) - Ord('0');
    if v > 255 then Exit;
    ipx[i] := v;
  end;
  Result := Longint(ipx);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Label1.Caption := IntToStr (IPToLong(Edit1.Text));
end;


Echter de waardes die deze functie terug geeft lijken op het eerste gezicht nergen op te slaan. Ik begreep het pas toen ik deze converteerde naar HEX:

10.0.0.1 --> 16777226 --> 10000A
10.0.0.2 --> 33554442 ---> 20000A
10.0.0.3 ---> 50331658 ---> 30000A

Ik heb op google gezocht maar kan niks vinden over hoe ik zou moeten tellen met waardes zoals hierboven.

Is er iemand die weet hoe ik hoe ik op basis van de bovenstaande waardes een lijst maak van IP's binnen een bepaalde range? Of heeft iemand een betere manier om dit te doen ?

  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Draai de bytes om :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Waarom zou je die hele omrekening willen doen? Je hebt 4 losstaande variabelen in je array, waarom dan geen 4-dubbel geneste for-constructie? Verder zijn er ook vast wel recursieve oplossingen te bedenken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Waar heb je die berekening vandaan??
Lijkt me niet echt kloppen dit gedeelte:
code:
1
2
  v := ipx[i] * 10 + Ord(ip[x]) - Ord('0');
    if v > 255 then Exit;


Als het ooit terug wilt rekenen zul je toch met machten moeten gaan werken
dus i: 10.0.0.1
wordt
10^1 * 1
10^2 * 0
10^3 * 0
10^4 * 10
----------------+
vul maar in

[edit]
(waarom ik nu met machten van 10 werk is mij een raadsel, machten van 256 is idd beter)

[ Voor 55% gewijzigd door Verwijderd op 25-05-2004 13:48 ]


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Omdat omrekening simpel is: (naar een 32 bit unsigned interger)

A.B.C.D => 256^3 * a + 256^2 *b + 256^1 *c + 256^0 * d

beter:

code:
1
2
3
4
5
6
7
sum = a;
sum = sum << 8
sum +=b;
sum = sum << 8
sum +=c;
sum = sum << 8
sum +=d;


Nu kan je ook makkelijk matchen met bitmasks enzo

Andersom:

d = sum AND 0x000000FF
c = sum AND 0x0000FF00 >> 8
b = sum AND 0x00FF0000 >> 16
a = sum AND 0xFF000000 >> 24

nu:
code:
1
2
3
4
5
6
7
counter = start = toInt("10.0.0.1")
end = toInt("10.0.0.254")
while (counter!=end)
{
    counter++
    print(toIP(counter));
}

[ Voor 121% gewijzigd door 12_0_13 op 25-05-2004 13:48 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Belangrijke tip: [google=ntohl].

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 25 mei 2004 @ 13:44:
Belangrijke tip: [google=ntohl].
Top! ik krijg nu idd een lijst met opvolgende nr's
nu is het alleen nog zaak om deze terug te converteren naar IP's :)
ga ffe de juiste functies erbij zoeken.

Verwijderd

Topicstarter
FYI:

het werkt inmiddels al een tijdje. bedankt allemaal!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.MakeIPList;
var
  NumStrings: TStringlist;
  a, b: TInAddr;
  I1, I2, I3, I4, I: Integer;
  P: PChar;
begin
  IPList := TStringList.Create;
  IPList.Clear;
  NumStrings := TStringList.Create;
  a.S_addr := Inet_addr(PChar(IP1RangeEdt.Text));
  b.S_Addr := inet_addr(PChar(IP2RangeEdt.Text));
  I1 := ntohl (a.S_addr);
  I2 := ntohl (b.S_addr);
  for I:=I1 to I2 do
  begin
     NumStrings.Add (IntToStr(I));
  end;
  for I3 := 0 to NumStrings.Count-1 do
  begin
    I4 := StrToInt (NumStrings[I3]);
    a.S_addr := ntohl (I4);
    P := inet_ntoa (a);
    IPList.Add(Pchar(P));
  end;
end;

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

Verwijderd schreef op 07 juni 2004 @ 13:19:
FYI:

het werkt inmiddels al een tijdje. bedankt allemaal!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.MakeIPList;
var
  NumStrings: TStringlist;
  a, b: TInAddr;
  I1, I2, I3, I4, I: Integer;
  P: PChar;
begin
  IPList := TStringList.Create;
  IPList.Clear;
  NumStrings := TStringList.Create;
  a.S_addr := Inet_addr(PChar(IP1RangeEdt.Text));
  b.S_Addr := inet_addr(PChar(IP2RangeEdt.Text));
  I1 := ntohl (a.S_addr);
  I2 := ntohl (b.S_addr);
  for I:=I1 to I2 do
  begin
     NumStrings.Add (IntToStr(I));
  end;
  for I3 := 0 to NumStrings.Count-1 do
  begin
    I4 := StrToInt (NumStrings[I3]);
    a.S_addr := ntohl (I4);
    P := inet_ntoa (a);
    IPList.Add(Pchar(P));
  end;
end;
2 dingen:
1) wil je NumString alsjeblieft Free-en? Je krijgt zo een memleak.
2) Waarom gebruik je NumStrings nog?
Delphi:
1
2
3
4
5
6
7
8
9
10
11
  for I:=I1 to I2 do
  begin
     NumStrings.Add (IntToStr(I));
  end;
  for I3 := 0 to NumStrings.Count-1 do
  begin
    I4 := StrToInt (NumStrings[I3]);
    a.S_addr := ntohl (I4);
    P := inet_ntoa (a);
    IPList.Add(Pchar(P));
  end;
wordt
Delphi:
1
2
3
4
5
6
7
8
  for I := I1 to I2 do
  begin
    { NumStrings[I3] is ook gewoon IntToStr(I) }
    I3 := StrToInt(IntToStr(I));
    a.S_addr := ntohl(I3);
    P := inet_ntoa(a);
    IPList.Add(PChar(P));
  end;
Je bouwt nml eerst een list op, en gaat daarna meteen itereren over de waarden erin. Je kan volgens mij dat opbouwen van die list achterwege laten.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:52

Creepy

Tactical Espionage Splatterer

IceManX schreef op 07 juni 2004 @ 13:36:
[...]
Delphi:
1
2
3
4
5
6
7
8
  for I := I1 to I2 do
  begin
    { NumStrings[I3] is ook gewoon IntToStr(I) }
    I3 := StrToInt(IntToStr(I));
    a.S_addr := ntohl(I3);
    P := inet_ntoa(a);
    IPList.Add(PChar(P));
  end;
Je bouwt nml eerst een list op, en gaat daarna meteen itereren over de waarden erin. Je kan volgens mij dat opbouwen van die list achterwege laten.
En als je dan toch verbeteringen doorgeeft haal dan die StrToInt(IntTostr()) ook weg en gebruik meteen ntohl(i); ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

oeps :o

Iets te letterlijk gereplaced ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1