![]() |
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:
Aber ich hab keine Ahnung wie ich das mit dem Ping umsetzen soll. Das mit dem Rot/Grün weiß ich :P
"ping adresse"
if ping = true then shape1.color := cl_Green; else shape1.color := cl_Red; Freue mich über jede Art von Hilfe :D |
Re: Ping und Daten Verwerten
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab schonmal was dazu gefunden ( ping und trace siehe Anhang )
|
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 |
Re: Ping und Daten Verwerten
Hi,
bisher habe ich nur trace gebraucht und das geht mit Zitat:
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; |
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? |
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
|
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? |
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:
Aber es kommt immer dieser Error:
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; Zitat:
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? |
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! |
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. |
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:
Und wie gesagt der Ping an sich funktioniert, aber es dauert zu lange finde ich, kann ich das irgendwie beschleunigen?
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. Es sind 5 Pings und er braucht ca. 40 sek das finde ich zu lange, am inet kanns net liegen, hab DSL 16k :P |
Re: Ping und Daten Verwerten
wieso machst du überhaupt diese if verschachtelung, denn so wie dus hast werden die eh alle abgearbeitet
Delphi-Quellcode:
so gehts doch auch oder nicht? und wenn du alle deine brushes vorher rot machst dann kannst du dir den else teil auch sparen.
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... 5 pings gesammt oder 5 pings pro adresse? |
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. |
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; |
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? |
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.
|
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? |
Re: Ping und Daten Verwerten
Da scheint irgend etwas mit Deinen Indies nicht zu stimmen. Hast Du unterschiedliche Versionen installiert?
|
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; |
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?).
|
Re: Ping und Daten Verwerten
Zitat:
|
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:
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:
IdIcmpClient1.Ping();
|
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).
|
Re: Ping und Daten Verwerten
Delphi-Quellcode:
Quelle:
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 ![]() |
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; |
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.
|
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ß |
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.
|
Re: Ping und Daten Verwerten
Ah danke :D
Jetz funktioniert alles :zwinker: Danke an alle die geholfen haben |
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; |
Re: Ping und Daten Verwerten
Ich hab es jetzt so gemacht:
Delphi-Quellcode:
Und es funktioniert :D
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. |
Re: Ping und Daten Verwerten
Du machst aber immer wieder das Gleiche, da drängt sich eine weitere Funktion doch geradezu auf.
|
Re: Ping und Daten Verwerten
hm, wie meinst du das?
Das versteh ich grad net :oops: |
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.
|
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" |
Re: Ping und Daten Verwerten
Jepp, habe auch was vergessen:
Delphi-Quellcode:
Wobei Du TYourform durch den Namen Deiner Formularklasse ersetzen musst (vermutlich TForm1).
...
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; |
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 04:34 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