![]() |
Mit IP-Adressen rechnen...
Hallo, ich möchte gerne einer als String vorhandenen IP-Adresse einen Offset geben sprich:
aus 192.168.0.1 wird 192.168.0.101 Ich denke mal ich muss irgendwie an das letzte oktett kommen, dann strgtoint und dann 100 addieren. bloß wie mache ich das am sinnvollsten? |
Re: Mit IP-Adressen rechnen...
|
Re: Mit IP-Adressen rechnen...
hoi,
wenn du die IP auch anzeigst kannst Du JvIPAddress nehmen [JEDI] dort kannst du bequem auf alle einzelnen Bereiche zugreifen. Mit ner Stringlist sollte es auch klappen -> Delimiter='.' und dann Wert 4 zum rechnen. cya |
Re: Mit IP-Adressen rechnen...
Hi SaltJohn,
auch von mir ein herzliches Willkommen in der Delphi-Praxis. :cheer: Um den String aufzuteilen habe ich mal diese ganz nützliche Funktion im Internet gefunden :
Delphi-Quellcode:
type
ArrOfStr = array of string; function Explode(var a: ArrOfStr; Border, S: string): Integer; var S2: string; begin Result := 0; S2 := S + Border; repeat SetLength(A, Length(A) + 1); a[Result] := Copy(S2, 0, Pos(Border, S2) - 1); Delete(S2, 1, Length(a[Result] + Border)); Inc(Result); until S2 = ''; end; |
Re: Mit IP-Adressen rechnen...
Moin,
ab und zu werden auch die vom Betriebssystem vorgesehenen Routinen benutzt:
Delphi-Quellcode:
Freundliche Grüße
uses
WinSock; var inAddr: TINAddr; s: string; begin inAddr.S_addr := inet_addr('192.168.0.1'); with inAddr.S_un_b do s_b4 := #101; s := inet_ntoa(inAddr); ShowMessage(s); end; |
Re: Mit IP-Adressen rechnen...
Zunächst recht vielen Dank für die nette Aufnahme in Eurem Forum :) jetzt zu den Vorschlägen. Also ich hab mir mal instinktiv den kürzesten Code geschnappt sprich den von Marabu.
Der Code funktioniert auch recht gut nur leider ist die IP in meinem Programm von Anweder zu Anwender verschieden und somit ist auch das 4. Oktett variabel. Dehalb muss ich es noch irgendwie schaffen das 4. Oktett der zuvor eingegebenen IP-Adresse auszulesen um dieses gegebenfalls in eine Zahl umwandeln und mit einem beliebigen Offset von z.B. 100 zu versehen. |
Re: Mit IP-Adressen rechnen...
Du schaffst das:
Delphi-Quellcode:
// ...
with inAddr.S_un_b do s_b4 := Chr(Ord(s_b4) + 100); // ... |
Re: Mit IP-Adressen rechnen...
Zitat:
|
Re: Mit IP-Adressen rechnen...
danke Marabu es läuft soweit allerdings möchte ich zum Schluss noch eine zweite Adresse mit Offset generieren und das klappt noch nicht. Es erscheint dann eine völlig andere. Womöglich muss ich noch reservierten Speicher freigeben oder so.
Delphi-Quellcode:
Wenn du mir kurz erklärst was dein Code eigentlich so macht komme ich evtl. alleine drauf :)
procedure TForm1.Button5Click(Sender: TObject);
var inAddr: TINAddr; IPAdresse : string; IPAdresseOffset1 : string; IPAdresseOffset2 : string; begin IPAdresse := Edit1.Text; inAddr.S_addr := inet_addr(PChar(IPAdresse)); with inAddr.S_un_b do s_b4 := Chr(Ord(s_b4) + 100); IPAdresseOffset1 := inet_ntoa(inAddr); Edit2.Text := IPAdresseOffset1; with inAddr.S_un_b do s_b4 := Chr(Ord(s_b4) + 200); IPAdresseOffset2 := inet_ntoa(inAddr); Edit3.Text := IPAdresseOffset2; end; Edit: @Stephan B. So eine Prüfung ist scheinbar schon vorhanden denn sobald 255 überschritten wird gehts wieder mit 0 aufwärts los :) Edit2: Habe es jetzt soweit hinbekommen. Wenn der Offset2 bsp. 200 sein soll muss ich ja einfach nur nochmal 100 zum 1. addieren. Jedoch verstehe ich den eigentlichen Ablauf immer noch nicht.
Delphi-Quellcode:
//...
with inAddr.S_un_b do s_b4 := Chr(Ord(s_b4) + 100); IPAdresseOffset2 := inet_ntoa(inAddr); Edit3.Text := IPAdresseOffset2; //... |
Re: Mit IP-Adressen rechnen...
Hallo,
die beiden Funktionen zur Wandlung zwischen String- und Binärdarstellung einer IP-Adresse kannst du ja in der Hilfe nachschlagen, also scheinst du ein Verständnisproblem mit der eigentlichen Adressumsetzung zu haben.
Delphi-Quellcode:
Der Typ TInAddr wird mehrfach redefiniert, so dass man seine vier Bytes auf verschiedene Weise ansprechen kann. Schau mal in die Unit WinSock - oder wenn du diese nicht hast:
// ...
with inAddr.S_un_b do s_b4 := Chr(Ord(s_b4) + 200); // ...
Delphi-Quellcode:
Freundliche Grüße
type
{$EXTERNALSYM SunB} SunB = packed record s_b1, s_b2, s_b3, s_b4: u_char; end; {$EXTERNALSYM SunW} SunW = packed record s_w1, s_w2: u_short; end; PInAddr = ^TInAddr; {$EXTERNALSYM in_addr} in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end; TInAddr = in_addr; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz