Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Ping und Daten Verwerten (https://www.delphipraxis.net/118235-ping-und-daten-verwerten.html)

gasty 3. Aug 2008 17:59


Ping und Daten Verwerten
 
Also Hallo erstmal :D
Mein Problem ist dieses:
Ich bin relativ neu in Delphi, lern erst seit nem halben Jahr und das auch nur in der Schule, also Basics hab ich relativ gut drauf aber mehr auch net ^^

Also ich möchte eine Adresse anpingen und dann ein grünes oder ein rotes Bild anzeigen (je nach dem ob ping funktioniert hat oder nicht)


Also ich könnte mir vorstellen dass es ungefähr so werden wird:

Delphi-Quellcode:
"ping adresse"
if ping = true then shape1.color := cl_Green;
else shape1.color := cl_Red;
Aber ich hab keine Ahnung wie ich das mit dem Ping umsetzen soll. Das mit dem Rot/Grün weiß ich :P


Freue mich über jede Art von Hilfe :D

hboy 3. Aug 2008 18:50

Re: Ping und Daten Verwerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab schonmal was dazu gefunden ( ping und trace siehe Anhang )

gasty 3. Aug 2008 18:53

Re: Ping und Daten Verwerten
 
So und wie benutz ich das? :P
Also wenn ich das so anschau denk ich irgendwie in das Projekt einbeziehen und dann ICMPPing als wert für das grün bzw rote fenster benutzen.
Aber es wäre nett wenn du mir erklärst wie ich das genau mache :D

hboy 3. Aug 2008 19:01

Re: Ping und Daten Verwerten
 
Hi,

bisher habe ich nur trace gebraucht und das geht mit


Zitat:

procedure TraceCallback(hop, ip: dword; rtt: integer); stdcall;
var s :string;
begin
if rtt = -1 then s := '*' else s := inttostr(rtt);
if s = '*'
then form1.memo1.lines.add('#'+inttostr(hop) + ' * -- ' + inet_ntoa(in_addr(ip)))
else form1.memo1.lines.add('#'+inttostr(hop) + ': ' + s + 'ms -- ' + inet_ntoa(in_addr(ip)));
application.processmessages;
end;

tracert(dnsnametoip(param),TraceCallback,30);
Ping ist noch einfacher, da musst du nur die einzelnen Bytes der IP in ein DWORD packen.

Delphi-Quellcode:
procedure TForm1.irgendwas(Sender :TObject);
var
  ip: DWORD;
  var b: Array[0..3] of Byte absolute ip;
  ping : Boolean;
begin
  b[3] := 192; b[2] := 168; b[1] := 0; b[0] := 1;
  ping := ICMPPing(ip);
end;

gasty 3. Aug 2008 19:16

Re: Ping und Daten Verwerten
 
Kann ich mit dem Programm auch DNS-Adressen anpingen?
Und wie benutz ich dann den Ping um das Shape entsprechend zu färben?

helgew 3. Aug 2008 19:54

Re: Ping und Daten Verwerten
 
Dazu brauchst du ein Ereignis, entweder ein Timer-Event oder ein ButtonClick, um etwas zu machen. Setze einfach einen Timer in dein Formular und doppelklicke drauf, dann solltest du in ´TForm1.Timer1Timer(Sender:TObject) landen, welches dann der Form nach meinem obigen Beispiel folgt und nachdem du den Boolean zugewiesen hast, kommt dein Codeschnippel

gasty 4. Aug 2008 13:12

Re: Ping und Daten Verwerten
 
also ich habe vor über einen Button eine Liste von adressen zu checken, ob diese erreichbar sind.
also
"button click"
"ping adresse1" if ping = true then shape1.color := cl_green;
else shape1.color := cl_red;
"ping adresse2" ... usw.

Und wie kann ich damit dns adressen anpingen?
und wie kann ich die .pas datei überhaupt in mein Projekt einbinden?

gasty 4. Aug 2008 16:54

Re: Ping und Daten Verwerten
 
Also ich hab jetzt bei Delphi "Projekt - Dem Projekt hinzufügen" gemacht und die trace.pas hinzugefügt, dann testweise versucht einen ping auf button-click zu programmieren.

Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
var
  ip: DWORD;
  var b: Array[0..3] of Byte absolute ip;
  ping : Boolean;
begin
  b[3] := 127; b[2] := 0; b[1] := 0; b[0] := 1;
  ping := ICMPPing(ip);
  if ping = true then shape1.brush.color := clgreen
  else shape1.brush.color := clred;
end;
Aber es kommt immer dieser Error:
Zitat:

[Fehler] Unit1.pas(115): Undefinierter Bezeichner: 'ICMPPing'
Ok, habe diesen Fehler gelöst :P
hab einfach bei uses trace hingeschrieben, aber jetz bleibt immernoch die eine große frage:
Wie kann ich DNS-Adressen anpingen? :D

Danke schonmal an alle die bisher geholfen haben :P

//Edit: Noch ne Frage:
Also ich hab es jetzt mit vielen if gemacht und würde gerne wissen ob es nicht besser geht, da ich das irgendwie nicht so schön finde. (Hab schon mit case probiert, geht aber irgendwie nicht)
Aber das komische ist, er zeigt immer rot an, obwohl die adresse erreichbar ist. (router-ip)
Wahrscheinlicht liegt der Fehler wieder an mir also poste ich mal den quelltext ;D
Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
var
  ip: DWORD;
  var b: Array[0..3] of Byte absolute ip;
  ping : Boolean;
begin
  x := 1;
  if x = 1 then
    begin
      b[3] := 192; b[2] := 168; b[1] := 2; b[0] := 1;
      ping := ICMPPing(ip);
      if ping = true then shape1.brush.color := cllime
      else shape1.brush.color := clred;
      x := 2;
    end;
  if x = 2 then
    begin
      b[3] := 192; b[2] := 168; b[1] := 2; b[0] := 1;
      ping := ICMPPing(ip);
      if ping = true then shape2.brush.color := cllime
      else shape2.brush.color := clred;
      x := 3;
    end;
  if x = 3 then
    begin
      b[3] := 192; b[2] := 168; b[1] := 2; b[0] := 1;
      ping := ICMPPing(ip);
      if ping = true then shape3.brush.color := cllime
      else shape3.brush.color := clred;
      x := 4;
    end;
  if x = 4 then
    begin
      b[3] := 192; b[2] := 168; b[1] := 2; b[0] := 1;
      ping := ICMPPing(ip);
      if ping = true then shape4.brush.color := cllime
      else shape4.brush.color := clred;
      x := 5;
    end;
  if x = 5 then
    begin
      b[3] := 192; b[2] := 168; b[1] := 2; b[0] := 1;
      ping := ICMPPing(ip);
      if ping = true then shape5.brush.color := cllime
      else shape5.brush.color := clred;
      x := 0;
    end;
end;


Also die 2 großen Fragen:
Wie pinge ich DNS-Adressen?
und
Wie funkioniert das richtig, da ich das Gefühl hab, ich hab in dem Quelltext etwas falsch gemacht?

xSkaschY 4. Aug 2008 19:09

Re: Ping und Daten Verwerten
 
Mal ne Frage, was soll der unnötige If-Abfragen kram?

Code:
x = 1
if x = 1 then...

x = 2
if x = 2 then...

usw.


DNS -> schau dir mal LookupHostName an.

//


Alternativ: Indy!

gasty 4. Aug 2008 19:19

Re: Ping und Daten Verwerten
 
ich will ja mehrere adressen abfragen, ich hab jetz im beispiel nur eine genommen um zu testen ob der ping geht, was aber auch nicht der fall ist
und mich stören die vielen if-abfragen auch aber wie kann ich das besser umsetzen? mit case färbt sich nur das erste kästchen.

Ich hab jetz auch Indy, aber keine Ahnung wie ich das benutzen kann.
Ich denke mal es hat was mit der IdICMPClient Kompo zu tun für das pingen und IdDNSResolve um DNS-Adressen aufzulösen.
Nun habe ich aber wie gesagt keine Ahnung was ich mit diesen Kompos machen soll.

gasty 5. Aug 2008 11:51

Re: Ping und Daten Verwerten
 
Also ich habe jetz eine Lösung gefunden :D Aber wieder ein neues Problem :wall:
Der Ping an sich funktioniert, aber es dauert ziemlich lange.
Ich habe den ping code jetz so geändert:
Delphi-Quellcode:
  if x = 1 then
    begin
      host:='www.google.de';
      code := ping(host,hopcount,rtt,ipad);
      if code = 0 then begin // ping kam an
        shape1.Brush.color := cllime;
      end else shape1.Brush.color := clred;
      x := 2;
    end;
  if x = 2 then
    begin
      host:='www.microsoft.com';
      code := ping(host,hopcount,rtt,ipad);
      if code = 0 then begin // ping kam an
        shape2.Brush.color := cllime;
      end else shape2.Brush.color := clred;
      x := 3;
    end;
usw.
Und wie gesagt der Ping an sich funktioniert, aber es dauert zu lange finde ich, kann ich das irgendwie beschleunigen?
Es sind 5 Pings und er braucht ca. 40 sek das finde ich zu lange, am inet kanns net liegen, hab DSL 16k :P

Kalfany 5. Aug 2008 13:07

Re: Ping und Daten Verwerten
 
wieso machst du überhaupt diese if verschachtelung, denn so wie dus hast werden die eh alle abgearbeitet

Delphi-Quellcode:
host:='www.google.de';
code := ping(host,hopcount,rtt,ipad);
if code = 0 then begin // ping kam an
  shape1.Brush.color := cllime;
end else
  shape1.Brush.color := clred;

host:='www.microsoft.com';
code := ping(host,hopcount,rtt,ipad);
if code = 0 then begin // ping kam an
  shape2.Brush.color := cllime;
end else
  shape2.Brush.color := clred;
usw...
so gehts doch auch oder nicht? und wenn du alle deine brushes vorher rot machst dann kannst du dir den else teil auch sparen.

5 pings gesammt oder 5 pings pro adresse?

gasty 5. Aug 2008 13:17

Re: Ping und Daten Verwerten
 
5 pings insgesamt, also 5 adressen die angepingt werden.
Ich werds mal ohne das if probieren.

geht auch, aber es ist immernoch zu langsam, kann man das irgendwie optimieren? oder geht es vielleicht mit indy schneller? aber ich hab keine ahnung wie ich mit indy pingen kann.

DeddyH 5. Aug 2008 13:26

Re: Ping und Daten Verwerten
 
Das Protokoll für Ping heißt ICMP, schau da mal in den Indys nach ;) . Außerdem könnte man Deinen Code noch ein wenig kürzen:
Delphi-Quellcode:
const sAdresses: array[0..4] of string = ('www.microsoft.de',
                                          'www.google.de',
                                          'www.delphipraxis.net',
                                          'german-bash.org',
                                          'www.sourceforge.net');
var i: integer;
    aShapes: array[0..4] of TShape;
begin
  aShapes[0] := Shape1;
  aShapes[1] := Shape2;
  aShapes[2] := Shape3;
  aShapes[3] := Shape4;
  aShapes[4] := Shape5;
  for i := 0 to 4 do
    if ping(sAdresses[i]) then
      aShapes[i].Brush.Color := clRed;
end;

gasty 5. Aug 2008 13:35

Re: Ping und Daten Verwerten
 
Also das es mit der ICMP Kompo was zu tun hat hab ich mir gedacht ^^
Aber wie benutze ich die denn?
Also bei Host kann man ja den namen eintragen, aber wie pingt man den dann an?

DeddyH 5. Aug 2008 14:00

Re: Ping und Daten Verwerten
 
Ich habe in der Firma leider kein Indy zur Verfügung. Wirf zur Not mal einen Blick in die Demos oder schau einfach mal, ob es eine Methode "Ping", "Execute" oder so gibt.

gasty 5. Aug 2008 14:07

Re: Ping und Daten Verwerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also wenn ich ein icmp-client draufsetze und versuche das programm zu starten kommt immer ein Error - Bild angehängt.
Ich habe noch nichts verändert, nur den client auf die form gesetzt und versucht zu starten, brauch ich vielleicht noch etwas anderes als diese eine kompo?

DeddyH 5. Aug 2008 14:09

Re: Ping und Daten Verwerten
 
Da scheint irgend etwas mit Deinen Indies nicht zu stimmen. Hast Du unterschiedliche Versionen installiert?

gasty 5. Aug 2008 14:16

Re: Ping und Daten Verwerten
 
Eigentlich habe ich nur die 10er installiert. Am besten installier ich es nochma neu.
Und geht es eigentlich mit indy schneller als mit dem code den ich habe? wenn nicht kann ichs mir ja eigentlich sparen :P
Aber 30-40sec für 5 pings find ich viel zu lang, so max. 10sec sollte es dauern.

Ahja btw, hier die funktion vom ping, vlt kann man da irgendwo timeout zeit einstellen oder so?
ich blick da nicht so ganz durch.

Delphi-Quellcode:
function GetRTTAndHopCount(DestIpAddress:DWORD; HopCount :pointer; MaxHops: DWORD;
    RTT : pointer):boolean; stdcall; external 'iphlpapi.dll';

function ping(host:string; var hopCount, RTT:DWORD; var ipAd:string):DWORD;

// by retnyg
// returns 0 is successfully, otherwise errorcode
// overwrites values hopcount, rtt, and ipad
// hopcount: number of hops
// rtt: roundtrip time
// ipAd: numerical ip-value, if used with a hostname
  function GetIPAddress(const HostName: string): string;
  var
    R: Integer;
    WSAData: TWSAData;
    HostEnt: PHostEnt;
    Host: string;
    SockAddr: TSockAddrIn;
  begin
    Result := '';
    R := WSAStartup($0101, WSAData);
    if R = 0 then
      try
        Host := HostName;
        if Host = '' then
        begin
          SetLength(Host, MAX_PATH);
          GetHostName(@Host[1], MAX_PATH);
        end;
        HostEnt := GetHostByName(@Host[1]);
        if HostEnt <> nil then
        begin
          SockAddr.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
          Result := inet_ntoa(SockAddr.sin_addr);
        end;
      finally
        WSACleanup;
      end;
  end;

var ip: DWORD;
begin
  result:=0;
  hopCount:=0;
  RTT:=0;
  ipAd := GetIPAddress(host);
  ip := inet_addr(@ipAd[1]);
  if not GetRTTAndHopCount(ip, @hopCount, 30, @RTT) then result:=GetLastError;
end;

DeddyH 5. Aug 2008 14:41

Re: Ping und Daten Verwerten
 
Ich denke schon, dass das mit Indy schneller geht, der Code scheint eher eine Art Traceroute durchzuführen (wozu sonst Hopcount?).

Kalfany 5. Aug 2008 14:47

Re: Ping und Daten Verwerten
 
Zitat:

Zitat von DeddyH
...der Code scheint eher eine Art Traceroute durchzuführen (wozu sonst Hopcount?).

schaut so aus, würde auch erklären warum das so lange dauert

gasty 5. Aug 2008 14:58

Re: Ping und Daten Verwerten
 
Hab jetz Delphi komplett neu installt und gesehn das hat schon indy drin *omg*
is wahrscheinlich v9 oder so, also denke ich hab ichs mit dem installen von v10 nur kaputt gemacht.
Und der befehl ist glaube ich
Delphi-Quellcode:
IdIcmpClient1.Ping();
Nur wie mach ich das jetzt dass sich das kästchen entsprechend färbt, ich hab ja kein wert der true oder false zurückgibt, oder sitzt das problem nur wieder einmal vor dem pc? :mrgreen:

DeddyH 5. Aug 2008 15:05

Re: Ping und Daten Verwerten
 
Ist immer schwierig zu beantworten, wenn man die Kompos gerade selbst nicht hat. Also, entweder ist Ping eine Funktion oder es gibt ein Event, das bei Antwort ausgelöst wird (OnResponse oder so).

Kalfany 5. Aug 2008 15:07

Re: Ping und Daten Verwerten
 
Delphi-Quellcode:
  IdIcmpClient.Host := Host;
  IdIcmpClient.TTL := TTL; //Time to live
  IdIcmpClient.ReceiveTimeout := 5000;
  IdIcmpClient.Ping;
  case IdIcmpClient.ReplyStatus.ReplyStatusType of
    rsEcho:
      begin
        lbLog.Items.Append(format('response from host %s in %d millisec.',
        [IdIcmpClient.ReplyStatus.FromIpAddress,
        IdIcmpClient.ReplyStatus.MsRoundTripTime]));
        result := true;
      end;
    rsError:
      lbLog.Items.Append('Unknown error.');
    rsTimeOut:
      lbLog.Items.Append('Timed out.');
    rsErrorUnreachable:
      lbLog.Items.Append(format('Host %s reports destination network unreachable.',
      [IdIcmpClient.ReplyStatus.FromIpAddress]));
    rsErrorTTLExceeded:
      lbLog.Items.Append(format('Hope %d %s: TTL expired.',
      [IdIcmpClient.TTL, IdIcmpClient.ReplyStatus.FromIpAddress]));
  end; // case
Quelle: delphi-treff.de

gasty 5. Aug 2008 15:24

Re: Ping und Daten Verwerten
 
Ok, so kann ich 1 ping ausführen, klappt auch :D
Nur wie mach ich das jetz mit der liste von adressen?

Mein bisheriger Versuch sieht so aus, was aber nicht funktioniert:
Delphi-Quellcode:
  x := 1;
  if x = 1 then
    begin
      IdIcmpClient1.Host := 'www.microsoft.com';
      IdIcmpClient1.Ping();
      case IdIcmpClient1.ReplyStatus.ReplyStatusType of
        rsEcho:
          begin
            shape1.brush.color := cllime;
          end;
      else shape1.brush.color := clred;
      x := 2;
      end;
    end;
  if x = 2 then
    begin
      IdIcmpClient1.Host := 'www.google.de';
      IdIcmpClient1.Ping();
      case IdIcmpClient1.ReplyStatus.ReplyStatusType of
        rsEcho:
          begin
            shape2.brush.color := cllime;
          end;
      else shape2.brush.color := clred;
      x := 0;
      end;
    end;

DeddyH 5. Aug 2008 15:27

Re: Ping und Daten Verwerten
 
Und was funktioniert nicht? Wieso wird x ständig gesetzt und gleich darauf wieder abgefragt? Irgendwie etwas sinnlos, was Du da machst.

gasty 5. Aug 2008 15:29

Re: Ping und Daten Verwerten
 
hm dann eben ohne x :P
Aber das was nicht funktioniert ist, es wird nur das erste shape gefärbt, das zweite bleibt weiß

DeddyH 5. Aug 2008 15:31

Re: Ping und Daten Verwerten
 
Klar bleibt das weiß. Schau mal genau, wo Du x auf 2 setzt und wozu das end dahinter gehört.

gasty 5. Aug 2008 15:34

Re: Ping und Daten Verwerten
 
Ah danke :D
Jetz funktioniert alles :zwinker:

Danke an alle die geholfen haben

DeddyH 5. Aug 2008 15:36

Re: Ping und Daten Verwerten
 
Versuch es mal so:
Delphi-Quellcode:
procedure GetPingSuccess(const URL: string; const Shape: TShape);
begin
  IdIcmpClient1.Host := URL;
  IdIcmpClient1.Ping();
  case IdIcmpClient1.ReplyStatus.ReplyStatusType of
    rsEcho: Shape.brush.color := cllime;
    else   Shape.brush.color := clred;
  end;
  Application.Processmessages;
end;

procedure TYourForm.Something;
begin
  GetPingSuccess('www.microsoft.de',Shape1);
  GetPingSuccess('www.google.de',Shape2);
end;

gasty 5. Aug 2008 15:39

Re: Ping und Daten Verwerten
 
Ich hab es jetzt so gemacht:
Delphi-Quellcode:
  IdIcmpClient1.Host := 'www.google.de';
  IdIcmpClient1.Ping();
    if IdIcmpClient1.ReplyStatus.ReplyStatusType = rsEcho then
      shape1.brush.color := cllime
    else shape1.brush.color := clred;

  IdIcmpClient1.Host := 'www.microsoft.com';
  IdIcmpClient1.Ping();
    if IdIcmpClient1.ReplyStatus.ReplyStatusType = rsEcho then
      shape2.brush.color := cllime
    else shape2.brush.color := clred;
usw.
Und es funktioniert :D

DeddyH 5. Aug 2008 15:40

Re: Ping und Daten Verwerten
 
Du machst aber immer wieder das Gleiche, da drängt sich eine weitere Funktion doch geradezu auf.

gasty 5. Aug 2008 15:42

Re: Ping und Daten Verwerten
 
hm, wie meinst du das?
Das versteh ich grad net :oops:

DeddyH 5. Aug 2008 15:43

Re: Ping und Daten Verwerten
 
Schau Dir mal den Unterschied zwischen Deinem und meinem Code an und überlege Dir, was Du ändern musst, wenn Du statt 5 einmal 20 Server anpingen willst oder auf andere Antworten reagieren willst.

gasty 5. Aug 2008 15:52

Re: Ping und Daten Verwerten
 
Also bei deinem Code wäre es viel einfacher den ping auf mehr server zu erweitern.
Aber wenn ich den benutzen will kommt immer "Undefinierter Bezeichner IdIcmpClient1"

DeddyH 5. Aug 2008 15:59

Re: Ping und Daten Verwerten
 
Jepp, habe auch was vergessen:
Delphi-Quellcode:
...
type
  TYourForm = class(TForm)
  ...
  private
    procedure GetPingSuccess(const URL: string; const Shape: TShape);
  ...
  end;

...

procedure TYourForm.GetPingSuccess(const URL: string; const Shape: TShape);
begin
  IdIcmpClient1.Host := URL;
  IdIcmpClient1.Ping();
  case IdIcmpClient1.ReplyStatus.ReplyStatusType of
    rsEcho: Shape.brush.color := cllime;
    else   Shape.brush.color := clred;
  end;
  Application.Processmessages;
end;

procedure TYourForm.Something;
begin
  GetPingSuccess('www.microsoft.de',Shape1);
  GetPingSuccess('www.google.de',Shape2);
end;
Wobei Du TYourform durch den Namen Deiner Formularklasse ersetzen musst (vermutlich TForm1).

gasty 5. Aug 2008 16:02

Re: Ping und Daten Verwerten
 
Ok, danke jetz klappts :D
Hoffentlich endgültig :P

Hm, aber wenn ich eine adresse angebe, die nicht erreichbar ist, also die nicht existiert, wird das shape nicht rot, sondern das programm hat einen "Socketfehler #11004"


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 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