AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mit IP-Adressen rechnen...

Ein Thema von SaltJohn · begonnen am 9. Jun 2008 · letzter Beitrag vom 17. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#1

Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 06:49
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 07:08
Hai SaltJohn,

erst einmal: "Herzlich Willkommen in der Delphi-PRAXiS"

Solch einen String kannst Du recht einfach mit Delphi-Referenz durchsuchenPos und Delphi-Referenz durchsuchenCopy bzw. mit Delphi-Referenz durchsuchenPosEx aufteilen.
Danach einfach die Teilstrings mit StrToInt umwandeln, addieren und wieder zurück wandeln.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
soulies

Registriert seit: 9. Dez 2005
234 Beiträge
 
#3

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 07:10
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 07:56
Hi SaltJohn,

auch von mir ein herzliches Willkommen in der Delphi-Praxis.

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;
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 08:01
Moin,

ab und zu werden auch die vom Betriebssystem vorgesehenen Routinen benutzt:

Delphi-Quellcode:
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;
Freundliche Grüße
  Mit Zitat antworten Zitat
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#6

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 09:21
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 09:25
Du schaffst das:

Delphi-Quellcode:
// ...
  with inAddr.S_un_b do
    s_b4 := Chr(Ord(s_b4) + 100);
// ...
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 09:37
Zitat von SaltJohn:
... und mit einem beliebigen Offset von z.B. 100 zu versehen.
Wobei Du in diesem Fall auch noch eine Prüfung einbauen solltest. Nicht das im 4. Oktett auf einmal ein Wert > 254 steht. (Subnetting jetzt mal aussen vor gelassen)
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#9

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 09:59
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:
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;
Wenn du mir kurz erklärst was dein Code eigentlich so macht komme ich evtl. alleine drauf


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;
//...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Mit IP-Adressen rechnen...

  Alt 9. Jun 2008, 14:50
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:
// ...
  with inAddr.S_un_b do
    s_b4 := Chr(Ord(s_b4) + 200);
// ...
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:

Delphi-Quellcode:
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;
Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 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