Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IP in einer IP-Range finden (https://www.delphipraxis.net/145900-ip-einer-ip-range-finden.html)

Mario61 10. Jan 2010 15:39


IP in einer IP-Range finden
 
Hallo, ich bin hier im Forum nicht fündig geworden deshalb versuche ich mein Problem mal zu beschreiben. Ich suche eine Routine, die mir anzeigt/sagt, ob eine IP in einer IP-Range vorhanden ist. Ich habe viel darüber hier gelesen, aber es ging nicht direkt um mein Problem. Ich habe z.B. eine IP, sagen wir mal 120.121.122.123 und ich möchte wissen ob diese z.B. in dieser Range 120.120.10.10-125.10.255.255 vorhanden ist. In diesem Beispiel wäre sie es. Ich habe schon vieles ausprobiert, aber bin nie zum Ergebnis gekommen. Es hat also nichts mit irgendwelchen INTERNEN IP's zu tun, oder irgendwelchen NETMASKEN... einfach festellen ob diese "Zahlen-Kolonne" in der Range vorkommt. Kann mir da jemand helfen?

mkinzler 10. Jan 2010 15:42

Re: IP in einer IP-Range finden
 
Vergleiche blockweise

sx2008 10. Jan 2010 17:09

Re: IP in einer IP-Range finden
 
Wenn du die Adressen mit der Funktion inet_addr() in einen 32-Bit Wert umwandelst, dann kannst du den Bereich direkt abprüfen:
Delphi-Quellcode:
uses ...,WinSock;
var
  ip, ip_start, ip_end: u_long;
begin
  ip := inet_addr(ip_string);
  // wichtig: prüfen, ob inet_addr() einen Fehler geliefert hat
 
  ip_start := inet_addr(...);

  ...
  if (ip >= ip_start) and (ip <= ip_end) then
    ShowMessage('bingo');

Mario61 10. Jan 2010 18:12

Re: IP in einer IP-Range finden
 
Erst einmal Danke für die schnellen Antworten.
Also wenn ich mal in deinem Code Daten einsetze wie hier,
Delphi-Quellcode:
var
  ip, ip_start, ip_end: u_long;
begin
ip := inet_addr('91.59.58.197');
  // wichtig: prüfen, ob inet_addr() einen Fehler geliefert hat

  ip_start := inet_addr('91.32.0.0'); //= 8283
  ip_end := inet_addr('91.63.255.255'); //= -49317


  if (ip >= ip_start) and (ip <= ip_end) then
    ShowMessage('bingo') else showMessage('nö');
end;
dann erhalte ich die Meldun "nö", aber man sieht ja, das diese IP in der Range ist...Hab ich da was falsch gemacht? Fehlen tut auch die Fehlerabfrage, mit der komme ich nicht so recht klar...

thkerkmann 10. Jan 2010 18:21

Re: IP in einer IP-Range finden
 
Der Vergleich wird so nicht funktionieren, da die Bytes der IP Addr dafür in der falschen Reihenfolge im Speicher stehen.
Ein Swap könnte helfen.

Gruss

Matze 10. Jan 2010 18:41

Re: IP in einer IP-Range finden
 
Notfalls mach es wie Markus geschrieben hat und vergleiche blockweise. Eine Quick&Dirty-Lösung:

Delphi-Quellcode:
uses StrUtils;

function IsIPInRange(IP2Check: string; IPStart: string; IPEnd: string): Boolean;
type
  TIPv4 = record
    Num1, Num2, Num3, Num4: Byte;
  end;

var
  IP2CheckSplitted, IPStartSplitted, IPEndSplitted: TIPv4;

  function SplitIP(IP: string): TIPv4;
  var
    Pos1, Pos2: Integer;
  begin
    Pos1 := Pos('.', IP);
    Result.Num1 := StrToInt(Copy(IP, 1, Pos1 - 1));

    Pos2 := PosEx('.', IP, Pos1 + 1);
    Result.Num2 := StrToInt(Copy(IP, Pos1 + 1, Pos2 - Pos1 - 1));
    Pos1 := Pos2;

    Pos2 := PosEx('.', IP, Pos1 + 1);
    Result.Num3 := StrToInt(Copy(IP, Pos1 + 1, Pos2 - Pos1 - 1));
    Pos1 := Pos2;

    Result.Num4 := StrToInt(Copy(IP, Pos1 + 1, Length(IP) - Pos1));
  end;
begin
  IP2CheckSplitted := SplitIP(IP2Check);
  IPStartSplitted := SplitIP(IPStart);
  IPEndSplitted := SplitIP(IPEnd);

  Result :=
    (IP2CheckSplitted.Num1 >= IPStartSplitted.Num1) and (IP2CheckSplitted.Num1 <= IPEndSplitted.Num1) and
    (IP2CheckSplitted.Num2 >= IPStartSplitted.Num2) and (IP2CheckSplitted.Num2 <= IPEndSplitted.Num2) and
    (IP2CheckSplitted.Num3 >= IPStartSplitted.Num3) and (IP2CheckSplitted.Num3 <= IPEndSplitted.Num3) and
    (IP2CheckSplitted.Num4 >= IPStartSplitted.Num4) and (IP2CheckSplitted.Num4 <= IPEndSplitted.Num4);
end;
Aufruf:
Delphi-Quellcode:
if IsIPInRange('91.59.58.197', '91.32.0.0', '91.63.255.255') then
  ShowMessage('in range');
Du kannst die IP natürlich auch über eine TStringList o.ä. splitten lassen.

sx2008 10. Jan 2010 18:52

Re: IP in einer IP-Range finden
 
Wie thkerkmann geschrieben hat, muss man wohl noch die Bytereihenfolge drehen:
Delphi-Quellcode:
var
  ip, ip_start, ip_end: u_long;
begin
  ip := inet_addr('91.59.58.197');
  // wichtig: prüfen, ob inet_addr() einen Fehler geliefert hat
  if ip = INADDR_NONE then
    raise Exception.CreateFmt('%s ist keine gültige IP', ['91.59.58.197'])
 

  ip_start := inet_addr('91.32.0.0'); //= 8283
  // hier Fehlerprüfung ergänzen

  ip_end := inet_addr('91.63.255.255'); //= -49317
  // hier Fehlerprüfung ergänzen

  // Reihenfolge drehen (big endian -> little endian)
  ip      := ntohl(ip);
  ip_start := ntohl(ip_start);
  ip_end  := ntohl(ip_end);

  if (ip >= ip_start) and (ip <= ip_end) then
    ShowMessage('bingo') else showMessage('nö');
end;

Mario61 10. Jan 2010 20:32

Re: IP in einer IP-Range finden
 
WOW, vielen Dank, ihr habt mir wirklich sehr geholfen. Ich muss mich jetzt zwischen den beiden Beispielen von Euch entscheiden, denn beide funktionieren... Super Sache... Vielen Dank !!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz