AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Jede Sekunde ein Ping

Jede Sekunde ein Ping

Ein Thema von Antigo · begonnen am 22. Mär 2009 · letzter Beitrag vom 22. Mär 2009
Antwort Antwort
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#1

Jede Sekunde ein Ping

  Alt 22. Mär 2009, 21:33
Hi,
ich möchte gerne genau einmal pro Sekunde eine Adresse anpingen und dann entweder eine Antwortzeit, oder eben ein timeout haben, wobei ich dann jede Antwort die nicht innerhalb dieser einen Sekunde ankommt als timeout zähle.

In einem ersten Versuch habe ich dazu jede Sekunde einmal das Ping Programm von Windows aufgerufen, und als Parameter ein Timeout von etwas unter einer Sekunde gewählt und genau einen Ping gesendet. Die Konsolenausgabe hab ich dann geparsed und war eigentlich schon glücklich, nur dann fiel mir auf, dass bei dem Fall das er den Hostnamen der angepingt werden soll nicht auflösen kann, es mehr als eine Sekunde dauert bis ich dieses Resultat erhalte und den nächsten Ping losschicken kann. das versaut mir dann meine Statistik weil mir eine Sekunde in der ich kein Ping Resultat (Zeit oder timeout) bekommen hab fehlt.

Dann hab ich noch etwas recherchiert und die Komponente IdIcmpClient von den Jedis gefunden. Aber hier das selbe Problem, ich kann zwar ein Timeout von einer Sekunde einstellen, doch das Feststellen, dass der Hostname nicht aufgelöst werden kann, dauert ca. zwei Sekunden.

Ich hatte mir dann überlegt einfach einen Timer zu nehmen, der einmal pro Sekunde pingt (das hatte ich bisher auf schon) und für den Fall das noch keine Antwort über das Ereignis IdIcmpClient1Reply gekommen ist, diesen Ping als timeout zählt und den nächsten losschickt. Leider scheint der IdIcmpClient1.Ping(); Aufruf das Programm zu blockieren bis er den Fehler beim Auflösen des Hosts feststellt, so dass ich so auch nicht weiterkomme.

Ich müsste irgendwie das Versenden der Pings vom restlichen Programm abspalten und Auswerten aber ich habe keine rechte Ahnung von Thread Programmierung.


Ich hoffe mein Problem ist klar geworden und jemand hatt eine Idee wie ich es schaffe sekündlich einen Ping zu versenden und falls in der Zeit bis zum nächsten Ping keine Antwort kommt diesen zu verwerfen.


Ich danke schonmal im Vorraus.
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Jede Sekunde ein Ping

  Alt 22. Mär 2009, 22:52
Moin Michael,

such' hier mal nach Hier im Forum suchenIcmpSendEcho.
Das wäre dann direkt die API-Funktion der ein Ping ausgeführt wird.
Vielleicht kommst Du damit weiter.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#3

Re: Jede Sekunde ein Ping

  Alt 22. Mär 2009, 23:12
danke für den hinweis. ich werd mich mal schlau machen.

Vielleicht hat ja zwischenzeitlich noch jemand Ideen zu folgendem:

wollte das ganze jetzt doch mit der ping.exe von Window lösen. Idee war diesen Aufruf in einen Thread auszulagern und mit einem timer nach einer Sekunde zu gucken ob eine Antwort gekommen ist und diese ausgeben. Falls keine Antwort gekommen ist, sollte der Thread beendet werden ein Timeout ausgegeben und ein neuer Thread gestarten werden. Das Problem ist, dass ich den Thread der ja noch läuft nicht beenden kann... daher hab ich ein Speicherleck soweit ich das beurteilen kann, denn im Taskmanager wird der vom Programm verbrauchte Speicher immer größer...

Der Thread
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  beep;
  str:=Konsole('ping heise.de1 -n 1 -w 800');
  if not terminated then
    Synchronize(Update)
  else self.free;
end;

procedure TMyThread.Update;
begin
  Form1.SetTime(str);
end;

procedure TForm1.SetTime(Atime:string);
begin
  time:=Atime;
  done:=true;
end;
Der Timer
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  mythread:=TMyThread.Create(false);
  timer1.enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if done then
    memo1.lines.Add(FormatDateTime('dd.mm.yyyy, hh:mm:ss: ',Now)+time)
  else
    memo1.lines.Add(FormatDateTime('dd.mm.yyyy, hh:mm:ss: ',Now)+'Timeout');
 
  mythread.Terminate;
  mythread:=TMyThread.Create(false);
end;

Funktionieren tut das ganze sogar, nur wie gesagt wird der Speicher Verbrauch immer gößer, da die Threads wohl alle bestehen bleiben.


Jemand ne idee?
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Jede Sekunde ein Ping

  Alt 22. Mär 2009, 23:19
Moin Michael,

hast Du FreeOnTerminate des Threads auf true gesetzt?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#5

Re: Jede Sekunde ein Ping

  Alt 22. Mär 2009, 23:26
hab ich grad probiert, ändert aber leider nichts am steigenden Speicherverbrauch. Trotzdem danke für den tipp.

edit: hab jetzt mal das verzweiflung self.free aus der Execute Prozedur des Threads gelöscht, jetzt steigt der Speicher Verbrauch nicht mehr bei jedem ping an, sondern nur noch ab und an um wenige K. Wieweit ist sowas denn normal oder sollte das nicht eigtl gar nicht ansteigen?
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:29 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