Delphi-PRAXiS
Seite 2 von 3     12 3      

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

marabu 20. Mär 2006 06:52

Re: IP Range
 
Guten Morgen.

Kennt denn keiner mehr die Standard-Routinen inet_addr() und inet_ntoa() aus der Unit WinSock?

Nachdenkliche Grüße vom marabu

negaH 20. Mär 2006 07:07

Re: IP Range
 
Zitat:

Weil es zulangsam ist!!
Habs grad mal getest: ?.0.0.0 ?.50.255.255: nach über 4 Minuten CPU-Zeit habe ich den das Programm zurückgesetzt...
Dann darf mann nicht Äpfel mit Birnen vergleichen. Lass mich mal raten: du hast mit den WriteLn(IPToStr(IP)); getestet ? Dann vergleiche das mal mit deiner Methode die ebenfalls WriteLn() benutzt.
Logisch müssen deiner und mein Code fast identisch effizient sein mit dem Unterschied das es mit garnicht sonderlich um Effizienz im Laufzeitverhalten ging sondern um Effizienz im Sourcecode: sprich Überprüfungen, Vermeidung von Rangecheck Errors, sauberer Borland konformer Source.

@marabu: ich weis, denke aber das Luckie das selber machen wollte und eventuell die Unit WinSocks nicht einlinken will. Ich persönlich vermeide es immer WinSocks einzulinken wenn es sich vermeiden lässt. Das Problem ? ganz einfach weil die WinSocks DLLs wohl diejenigen DLLs im Windows sind die am meisten durch 3'rd Party Tools wie Virenscanner, Firewalls, ISDN Treiber, USB Treiber und Trojaner ausgetauscht bzw. sidelinked sind. Man lädt sich also mit WinSocks ohne es zu merken eventuell miesen Code in seine Anwendung.

Gruß Hagen

Harry M. 20. Mär 2006 07:10

Re: IP Range
 
Gut mir ging es damals bei der Entwicklung nur rein um Geschwindigkeit ;-)

negaH 20. Mär 2006 07:15

Re: IP Range
 
Begründung:

Gruß Hagen

Delphi-Quellcode:

type
  PIp = record    // <- TYPEN fangen mit T an
    p1 : String;
    P2 : String;
    p3 : String;
    p4 : String;
    end;         // <- Einrückungen, ein Block immer auf gleicher Höhe

type
MyIP = packed record  // <- Einrückungen
  case Byte of
    0: (D,C,B,A : Byte);
    1: (dwValue : DWord);
  end;

function SplittIP(IP: string): PIp; // <- String ist eigener Type also S groß bei String
var
  I: Integer;
begin
  Result.p1 := '';
  Result.p2 := '';
  Result.p3 := '';
  Result.p4 := '';

  I := 0;
  repeat
    Inc(I, 1);
    if IP[I] <> '.' then           // <- Hier AV bei IP = ''
      Result.p1 := Result.p1+IP[I]; // <- Leerzeichen zwischen Operatoren, alles am + geklitscht
  until
     IP[I] = '.';                  // <- eine Zeile höher, ist ja wohl nur schlecht
....
end;

function CreateIPPool(sStartIp, sEndIp: String): TStringList;
var
FromIP, ToIP, IP: MyIP; // <- Einrückungen
I: Integer;
Adress: PIp;
begin
  Result := TStringList.Create; // <- Allokation und Rückgabe von komplexen Datentypen sollte man vermeiden
                                 // besser ist es als Paramater Strings: TStrings zu übergeben damit der Aufrufer
                                 // der Funktion für die Datenhaltung verantwortlich bleibt.
  Adress := SplittIP(sStartIp);
  with FromIP do begin          // <- begin markiert einen neuen Source/Formtierungs Block, gehört in die nächste
                                 // Zeile direkt unter das with.
    A := StrToInt(Adress.p1);
    B := StrToInt(Adress.p2);
    C := StrToInt(Adress.p3);
    D := StrToInt(Adress.p4);
    end;

  Adress := SplittIP(sEndIp);
  with ToIP do begin
    A := StrToInt(Adress.p1);
    B := StrToInt(Adress.p2);
    C := StrToInt(Adress.p3);
    D := StrToInt(Adress.p4);
    end;

  for I := FromIP.dwValue to ToIP.dwValue do begin // <- begin
    IP.dwValue := I;
    with IP do
      Result.Add(Format('%d.%d.%d.%d',[A,B,C,D]));
    end;
end;

Sharky 20. Mär 2006 07:21

Re: IP Range
 
Hai Luckie,

mal eine Frage zu deinen IPs.
Warum brauchst Du denn die Adressen aus zwei verschiedenen Netzen?
Du hast das Netz 192.168.2.0 und 192.168.5.0 die beiden haben doch nichts miteinaner zu tun.
Oder sollte das ganze nur ein Beispiel für deinen "PINGer" sein?

phXql 20. Mär 2006 07:30

Re: IP Range
 
Zitat:

Zitat von negaH
Begründung:

Hi Hagen,

meiner Meinung nach wird string NICHT mit einem großen S geschrieben. Bei delphi ist string ein keyword (wird ja auch fett gemacht), und keywords schreibt man nunmal klein...

negaH 20. Mär 2006 07:39

Re: IP Range
 
das ist tatsächlich eine Ansichtssache. Es ist ein Bezeichner und müsste klein geschrieben werden das stimmmt. Allerdings arbeite ich seit Borland Pascal 4.2 und orientiere mich immer an dem Stil der Borlandianer. Wobei man sagen muß das die letzten Entwicklungen im Hause Borlnd nicht mehr als Referenz dienen können da die Sourcen immer schlechter geworden sind.

Es geht mir aber hier garnicht um solche Kleinigkeiten. Am wichtigsten ist der Fakt das obige Funktion bei IP = '' eine Zugriffsschutzverletzung erzeugen muss !! Übrigens muß ich dazu nichtmal den Source testen, lesen reicht schon aus um dies zu sehen.

Sorry, ich möchte hier keinen Krieg anzetteln. Jeder soll nach seinen Ansprüchen seine privaten Source bauen können wie er es möchte. Allerdings ist dies hier ein Forum und viele Anfänger orientieren sich in ihrem Programmierstil an solchen Beispielen wir hier gezeigt. Es ist also in unser aller Interesse wenn wir Sourcecode-technisch hier in der DP ein hohes Niveau hinbekommen könnten.

Zb. die Angewohnheit das begin NICHT in einer eigenen Zeile einzurücken ist schätzungsweise höchsten 8-10 Jahre alt. Davor wurde immer das begin eingerückt, bzw. mir persönlich sind keine Sourcen bekannt vor dieser zeit die es nicht einrückten. Leider hat sich diese Unart sehr schnell verbreitet.

Ok back to topic now, and sorry Luckie.

Gruß Hagen

Harry M. 20. Mär 2006 07:56

Re: IP Range
 
Zitat:

Zitat von negaH
TYPEN fangen mit T an

Stimmt. Ist ein Fehler von mir, weil ích halt auch nicht perfekt bin. Der Code ist noch aus ner alten Testphase wo ich noch mit Pointern spielte um zusehen was am Ende schneller ist.

Der Fainess halbe habe ich jetzt mal kurz das writeln gegen eine TStringList getauscht. Stimmt. Ich konnte die range innherhalb von 4547ms erzeugen. Ich muss aber dazu sagen das die CPU hier, wo ich grad bin etwas lahmer is als meiner da heim. Also könnte sie doch in etwas die Gleiche Effizienz haben.

Was die Zugriffsverletzung angeht: Habe ich bis heute nicht gesehen. Das Progie wo ich diesen Code reincomiliert habe läuft schon seit Monaten. Problemlos!

Luckie 20. Mär 2006 08:28

Re: IP Range
 
@Sharky: Ja das ist ein Beispiel für mein Pi9ng Programm. Warum sollte man nicht gleich verschiedenen Netze damit durchpingen wollen? ;)

marabu 20. Mär 2006 10:06

Re: IP Range
 
Hallo Hagen,

Zitat:

Zitat von negaH
ich weis, denke aber das Luckie das selber machen wollte und eventuell die Unit WinSocks nicht einlinken will.

stimmt, Luckie macht es manchmal gerne zu Fuß - aber wenn es um das Ping-Tool geht, da hat er WinSock eingebunden.

Zitat:

Zitat von negaH
Ich persönlich vermeide es immer WinSocks einzulinken wenn es sich vermeiden lässt.

Das glaube ich dir, aber nicht jeder kann sich diese Haltung leisten. Ich arbeite in einem managed environment. Meine Zeit in der DP erwirtschafte ich z.B. durch den Aufruf von inet_addr() anstatt 30 Zeilen eigenen Code zu schreiben. Das drückt meine Lines-Of-Code und damit meine Fehlerrate. Oft bewundere ich deine Vorgehensweise, aber es gibt Bereiche abseits deines Spezialgebietes, in denen man andere Prioritäten setzen muss, damit man nicht abgestraft wird.

Du hast in deinem Beitrag #17 über den Vorbildcharakter von publizierten Quellen für Anfänger geschrieben. Gerade bei Anfängern beobachte ich eine gewisse Dankbarkeit für Hinweise, wie man mit dem Aufruf von wenigen System-Routinen eigenen, mit Schweiß und Tränen geschriebenen Code mehrerer Tage ersetzen kann.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz