Entwickler-Ecke

Open Source Units - ICMP-Echo-API ("Ping") Wrapper-Unit v1.04


Narses - So 18.12.05 03:30
Titel: ICMP-Echo-API ("Ping") Wrapper-Unit v1.04


reichemi - Fr 03.03.06 14:03

hallo!

ich hab mir gerad deine unit sowie die demo runtergeladen, und muss sagen: das sieht seeehr gut und vielversprechend aus!! gefällt mir :)
beim quelltext-durchschauen ist mir aber aufgefallen: warum läßt du dir beim IcmpSendEcho()-Aufruf nicht auch die IPOptionInformation zurückgeben und schreibst diese mit in den TAsyncPingResult-Record (im asynchronen fall)? hattest du einen grund, oder gab es einfach keinen bedarf dafür? :wink:


Narses - Fr 03.03.06 15:28

Moin und :welcome: im Forum!

user profile iconreichemi hat folgendes geschrieben:
ich hab mir gerad deine unit sowie die demo runtergeladen, und muss sagen: das sieht seeehr gut und vielversprechend aus!! gefällt mir :)

Danke für das Lob! :D

user profile iconreichemi hat folgendes geschrieben:
beim quelltext-durchschauen ist mir aber aufgefallen: warum läßt du dir beim IcmpSendEcho()-Aufruf nicht auch die IPOptionInformation zurückgeben und schreibst diese mit in den TAsyncPingResult-Record (im asynchronen fall)? hattest du einen grund, oder gab es einfach keinen bedarf dafür? :wink:

Ich hab keinen Grund gesehen, das zurückzuliefern. Hast du einen sinnvollen Grund gefunden? :wink: Ausser der RTT und einem möglichst umfangreichen, aber zentralen Fehlerstatus braucht man bei einem Ping doch eigentlich nix... :gruebel:

Bis für Vorschläge offen!

cu
Narses


reichemi - Fr 03.03.06 18:07

user profile iconNarses hat folgendes geschrieben:
Moin und :welcome: im Forum!

danke :wink2:

user profile iconNarses hat folgendes geschrieben:
Ausser der RTT und einem möglichst umfangreichen, aber zentralen Fehlerstatus braucht man bei einem Ping doch eigentlich nix...

joaaa.... eigentlich ;-) aber dagegen sprechen zwei dinge:

1) ich finde die TTL noch ganz interessant ;-)
2) sollte man bei einer komponente doch dem programmierer möglichst viele informationen anbieten, und ihm die auswahl der für ihn sinnvollen infos überlassen -- oder? :gruebel:

user profile iconNarses hat folgendes geschrieben:
vom 05.03.-21.03. offline

na da hab ich ja glück gehabt, dass ich dich noch erwischt hab ;)


Narses - Fr 03.03.06 22:19

Moin!

user profile iconreichemi hat folgendes geschrieben:
joaaa.... eigentlich ;-) aber dagegen sprechen zwei dinge:
1) ich finde die TTL noch ganz interessant ;-)

Echt? Wozu hast du die (bei einem Ping!) jemals gebraucht... :gruebel:

user profile iconreichemi hat folgendes geschrieben:
2) sollte man bei einer komponente doch dem programmierer möglichst viele informationen anbieten, und ihm die auswahl der für ihn sinnvollen infos überlassen -- oder? :gruebel:

Ja, aber nach der Maxime: soviel wie nötig, so knapp wie möglich. :wink: Versteh mich recht, ich hab nix dagegen die z.B. TTL auch mit abzuliefern, aber es sollte auch einen Sinn haben. Funktionen, die parameterüberladen sind, nutzen selten viele davon aus, und nur weil es die Info grundsätzlich gibt, muss man sie ja nicht unbedingt immer gleich weiterreichen.

Abgesehen davon: für genau diesen Fall habe ich ja den Quelltext veröffentlicht. :wink: Wenn dir eigene Erweiterungen einfallen (die aber eher für dich spezifisch wichtig sind), dann kannste du dir die Unit ja nach deinem Ermessen für dich erweitern...

user profile iconreichemi hat folgendes geschrieben:
user profile iconNarses hat folgendes geschrieben:
vom 05.03.-21.03. offline

na da hab ich ja glück gehabt, dass ich dich noch erwischt hab ;)

Irgendwann muss der Mensch auch mal Urlaub machen. :D Abgesehen davon, ich verbringe glaub ich im Moment viel zuviel Zeit im DF, ich sollte auch mal wieder etwas Abstand nehmen :? :|

cu
Narses


reichemi - Fr 03.03.06 22:27

user profile iconNarses hat folgendes geschrieben:
Abgesehen davon: für genau diesen Fall habe ich ja den Quelltext veröffentlicht. :wink:


stimmt schon ;) mal sehen ob ichs mir noch dazu programmier...


trotzdem danke nochmal für die super unit und die schnelle antwort! :wave:


reddevil - Mo 06.03.06 17:03

Hallo

Zuerst einmal großes Lob an Dich. Du hast eine sehr schöne und nützliche Unit geschrieben.

Was mir jedoch aufgefallen ist, wenn oft die Funktion ExecuteAsync mit einem unaufgelösten Hostname aufgerufen wird, so steigt der Speicherverbrauch des Programms an. Er scheint linear mit der Anzahl der Aufrufe zu steigen, könnte also irgendwelcher Speicher sein der nicht wieder freigegeben wird.
Wenn anstelle des Hostname die Funktion mit der entsprechenden in_addr Struktur aufgerufen wird, so tritt dieser Effekt nicht auf. Ich würde daher vermuten, dass "der Fehler" zwischen Zeile 688 und 724 liegt (konnte ihn jedoch nicht finden).

Um den oben beschriebenen Effekt festzustellen reicht es in deinem PingDemo Programm einen Host (z.B. http://www.heise.de) etwa 20mal in die Hostliste hinzufügt und anschließend mehrfach asynchron anzupingen. Den Speicherbedarf kann man dabei im Taskmanager beobachten.

Ich hoffe du oder jemand anderes kann dieses Problem beheben.

Natürlich wünsche ich dir noch einen schönen Urlaub :)

red


Narses - Di 21.03.06 02:16

Moin!

user profile iconreddevil hat folgendes geschrieben:
Zuerst einmal großes Lob an Dich. Du hast eine sehr schöne und nützliche Unit geschrieben.

Danke für das Lob! :D

user profile iconreddevil hat folgendes geschrieben:
Was mir jedoch aufgefallen ist, wenn oft die Funktion ExecuteAsync mit einem unaufgelösten Hostname aufgerufen wird, so steigt der Speicherverbrauch des Programms an. Er scheint linear mit der Anzahl der Aufrufe zu steigen

Ja, weil du (zu)viele Threads startest, die du gar nicht brauchst. Nebenbei: ein Programm sollte AFAIK nicht mehr als 16 Threads laufen haben.

user profile iconreddevil hat folgendes geschrieben:
Ich würde daher vermuten, dass "der Fehler" zwischen Zeile 688 und 724 liegt (konnte ihn jedoch nicht finden).

Es ist kein Fehler in der Unit, sondern in der "Benutzung". :wink:

Im Anhang ist ein kleines Beispielprogramm, wie man das asynchrone Anpingen einer Liste von Hosts mit meiner Ping-Unit lösen könnte. Der "Trick" besteht darin, über die Callback-Funktion eine Ereignisverkettung aufzubauen. So laufen nie mehr als 2 Ping-Threads gleichzeitig (und brauchen auch nicht mehr Speicher, als nötig).

cu
Narses

Hinweis: Falls die Anhänge nicht da sind, die Seite (ggfs. auch mehrfach) neu laden, dann tauchen die Anhänge irgendwann auf (ist ein Bug in der aktuellen Forensoftware). :wink:


Delete - Di 21.03.06 08:54

user profile iconNarses hat folgendes geschrieben:
Nebenbei: ein Programm sollte AFAIK nicht mehr als 16 Threads laufen haben.

Warum? Wie kommst du auf diese Zahl? In meinem Suche in der Delphi-PRAXiS LUCKIEPING erzeuge ich 255 Threads auf einen Schlag. ;)

Zitat:

user profile iconreddevil hat folgendes geschrieben:
Ich würde daher vermuten, dass "der Fehler" zwischen Zeile 688 und 724 liegt (konnte ihn jedoch nicht finden).

Es ist kein Fehler in der Unit, sondern in der "Benutzung". :wink:

Nein, es ist ein Fehler in deinem Code. Du hast wahrschenlich da irgendwo ein Speicherleck.


reddevil - Di 21.03.06 11:48

Hallo

Ich habe mir dein neues Beispielprogramm angeschaut und festgestellt, dass dort das Speicherproblem nicht auftritt. Allerdings find ich das Programm auch relativ "sinnfrei", denn so wie du es dort umgesetzt hast, könnte man auch direkt syncron pingen.

Den von mir oben beschriebenen Effekt kannst du auch schon mit nur zwei Einträgen in der Hostliste deines PingDemo-Programmes feststellen. Die etwa 20 Einträge von mir waren nur gewählt, damit der Effekt deutlicher wird.
Bei nur einem Eintrag in der Hostliste steigt der Speicherverbrauch bei mir nicht an.
Daher könnte es vielleicht auch an irgendwelchen "nicht thread-sicheren" Windowsfunktionen liegen.

red


Narses - Di 21.03.06 12:25

Moin!

user profile iconLuckie hat folgendes geschrieben:
user profile iconNarses hat folgendes geschrieben:
Nebenbei: ein Programm sollte AFAIK nicht mehr als 16 Threads laufen haben.

Warum? Wie kommst du auf diese Zahl? In meinem Suche in der Delphi-PRAXiS LUCKIEPING erzeuge ich 255 Threads auf einen Schlag. ;)

Meine das mal als Empfehlung gelesen zu haben; aber da du so wehement dagegen hältst, bin ich mir schon nicht mehr so sicher... :?

user profile iconLuckie hat folgendes geschrieben:
Nein, es ist ein Fehler in deinem Code. Du hast wahrschenlich da irgendwo ein Speicherleck.

:( Naja, wenn du das sagst... dann werde ich mich mal mit "Räucherwerk auf dem Klo einschließen und nachdenken", wie man so sagt. ;)


user profile iconreddevil hat folgendes geschrieben:
Ich habe mir dein neues Beispielprogramm angeschaut [...] Allerdings find ich das Programm auch relativ "sinnfrei", denn so wie du es dort umgesetzt hast, könnte man auch direkt syncron pingen.

Hmm, also von "sinnfrei" kann mal nicht wirklich die Rede sein. ;) Wenn du das synchron machst, dann bleibt die GUI "hängen", weil keine Ereignisverarbeitung mehr stattfindet (während der Ping-executes), das passiert mit dem PingListe-Beispiel nicht.

cu
Narses


reddevil - Di 21.03.06 12:39

Sorry, ich habe mich schlecht ausgedrückt.
Das syncrone Pingen müsste man natürlich in einen extra Thread auslagern, man würde sich dann aber das häufige Thread-erzeugen und beenden in deinem Programm ersparren.

Ich fände es sehr gut wenn du den Fehler finden würdest, also viel Erfolg auf dem Klo. :)


Narses - Mi 22.03.06 16:48

Moin!

user profile iconreddevil hat folgendes geschrieben:
viel Erfolg auf dem Klo. :)

Danke, scheint genutzt zu haben! ;)

Um das Ergebnis vorwegzunehmen: die Unit ist IMHO fehlerfrei, das ist kein Speicherleck. :) Hier die Begründung:

Ich habe das im Anhang befindliche Testprogramm gestartet und den Speicherverbrauch nach jeweils einem Klick auf den Button aus dem Taskmanager abgeschrieben:

Quelltext
1:
2:
3:
4:
3616,3892,3948,3948,3972,3964,3968,4000,4180,4032,4248,4044,4048,
4140,4100 (nur gewartet),4224,4076,4268,4108,4144,4320,4160,4200,
4324,4144,4164,4284,4216,4376,4232,4412,4468,4340,4312,4524,4404,
4592,4408,4592,4472,4664,4536,4504,4696,4552,4760,4692,4828

Interpretation: Es ist zwar ein eindeutiger Aufwärtstrend sichtbar (durchschnittlich 127kb zunehmend, 116kb abnehmend), aber da auch im ersten markierten Fall 204kb freigegeben wurden, kann ich nicht an ein Speicherleck glauben. Ich denke vielmehr, dass es sich um die "normale" Fluktuation des Delphi-Speichermanagers handelt (besonders deshalb, weil im zweiten markierten Fall scheinbar eine garbage-collection stattgefunden hat).

Fazit: Ich schätze, meine Unit stellt im asynchronen Modus lediglich den Delphi-MemoryManager bloss... :| Wenn jemand tatsächlich ein Speicherleck finden sollte (was ich nicht kategorisch ausschließen will!), dann bin ich über jede Info dankbar. Ich kann keinen Thread-basierten Fehler erkennen, IMHO ist das ExecuteAsync threadsave!

Hinweis: Da in meinem ersten Demoprogramm auch das Log-Memo mit Text gefüllt wird, wenn man Ping-Aufträge erstellt, könnte der zunehmende Speicherverbrauch auch an dieser Stelle Begründung finden... :?:

cu
Narses


reddevil - Do 23.03.06 10:46

user profile iconNarses hat folgendes geschrieben:
Hinweis: Da in meinem ersten Demoprogramm auch das Log-Memo mit Text gefüllt wird, wenn man Ping-Aufträge erstellt, könnte der zunehmende Speicherverbrauch auch an dieser Stelle Begründung finden... :?:

Das kann ich ausschließen. Ich habe die Textausgabe auf das Log-Memo auskommentiert und der Speicherzuwachs war dennoch da.


An einen "Fehler" im MemoryManager will ich nicht glauben, allerdings weiss ich auch nicht woran es liegt.


Narses - Do 23.03.06 11:02

Moin!

user profile iconreddevil hat folgendes geschrieben:
An einen "Fehler" im MemoryManager will ich nicht glauben, allerdings weiss ich auch nicht woran es liegt.

Von einem Fehler redet auch niemand, da aber in der Hostname-Variante Strings auf den (in den threadsave-mode geschalteten) Heap gelegt werden und die Threads nicht alle synchron dazu terminieren, wird es einfach ein "Schweizer-Käse"-Problem sein, schätze ich. Wenn du in Zeile 637 "Hostname" durch '' ersetzt, tritt der Speicher-Effekt auch nicht mehr (so) auf (in meinem 2. Test-Programm, dass nur den Call macht).

Fazit: IMHO ist da kein Speicherleck, das ist ein Thread-Heap-Problem mit den Strings (prinzipbedingt). Ich will das Speicherleck nicht ausschließen, aber in separaten Tests, in denen ich alle Elemente des TPingThread.Execute getestet habe, ist der Speicherzuwachs nach Terminieren der Threads wieder abgebaut worden. Sobald die Strings ins Spiel kamen, wurde der Speicher nicht mehr vollständig abgebaut, sondern nach dem im letzten Post beschriebenen Verhalten.

Also, ohne neue Erkenntnisse lasse ich das so und unterstelle keinen Fehler in der Unit. ;)

cu
Narses


Zyklame - Mi 05.04.06 11:16

Vieleicht hat das Problem mit dem Delphi Speichermanager zu tun:

http://www.dsdt.info/insider/sprache/interna/speichermanager.php


Hendi48 - Fr 17.08.07 19:04

Wo krieg ich denn dieses TPing her? Ich find das nur für Delphi 3 aber ich brauchs für D2007 =(


Narses - Mo 20.08.07 00:16

Moin!

user profile iconHendi48 hat folgendes geschrieben:
Wo krieg ich denn dieses TPing her?

Was für ein TPing? :gruebel:

Im ersten Beitrag (wie hier üblich... :roll:) ist doch die komplette Unit und im Anhang eine Demo... :nixweiss: :mahn: :les: ;)

cu
Narses


Bookworm - Do 30.08.07 22:19

Irgendwie komm ich damit nicht klar :oops:
Ich meine, die fertig kompilierte Demo zeigt mir schon, dass es eigentlich genau das ist, was ich suche. Aber meine bescheidenen Delphi-Kenntnisse beinhalten leider nicht, wie ich aus diesem Unit-Quelltext die DCU mache, die ich später bei uses einbinden kann. Und die eigentliche Ping-Funktion finde ich auch nicht :oops:

Asche auf mein Haupt
Bookworm


Narses - Do 30.08.07 22:25

Moin!

Speicher den Unit-Quelltext als Ping.pasim Verzeichnis deines Programms ab. Pack in die uses-Klausel am Anfang des Programms:

Delphi-Quelltext
1:
2:
uses
   ..., Ping;

dann kannst du die Unit benutzen.

cu
Narses


Bookworm - Do 30.08.07 22:30

Nur um sicher zu gehen, dass ich keinen Mist baue:

1. Ich öffne Notepad o.ä.
2. Ich kopiere den Quelltext da rein
3. Ich speicher das als Ping.pas
4. Ich kopiere die Datein in das /lib Verzeichnis von Delphi

Alles richtig?

Gruß
Bookworm

P.S. Ich weiß, wie n00big ich aussehen muss :P


Narses - Do 30.08.07 22:36

Moin!

user profile iconBookworm hat folgendes geschrieben:
4. Ich kopiere die Datein in das /lib Verzeichnis von Delphi

Speicher die Ping.pas zunächst einfach in das Verzeichnis, in dem auch deine .dpr und die .exe liegen. Beim Compilieren wird dann auch eine Ping.dcu erzeugt, und die kannst du später dann ins /lib-Verzeichnis legen.

cu
Narses


Bookworm - Fr 31.08.07 11:58

Danke soweit schonmal!

Und jetzt, der eigentliche Teil: Wie pinge ich damit? Soweit wie ich den Quelltext verstanden habe, ist die Funktion Execute dafür zuständig, allerdins weiß ich nicht, wie ich die aufrufen soll :oops:

Erklärung/Beispiel wäre echt nett

Gruß
Bookworm


Narses - Fr 31.08.07 12:20

Moin!


Delphi-Quelltext
1:
2:
if (Ping.Execute('www.delphi-forum.de') >= 0then
  ShowMessage('Erreichbar!');

cu
Narses


Bookworm - Fr 31.08.07 12:34

Danke!
Noch ein letztes: Wie ping ich damit auf eine IP?


Narses - Fr 31.08.07 12:45

Moin!

user profile iconBookworm hat folgendes geschrieben:
Danke!

Bitte. ;)

user profile iconBookworm hat folgendes geschrieben:
Noch ein letztes: Wie ping ich damit auf eine IP?

:? :| :gruebel:

Hmm, ich bekomme langsam Zweifel, ob du überhaupt weisst, was du da machst - und ob es gut ist, dir dabei zu helfen... :nixweiss:

Du hast alles zum Einsteigen, schau dir nochmal sehr ausführlich das Beispielprogramm an, da ist das erklärt. :les:

Bitte die nächste Anfrage mit einem Stück Code machen, der zeigt, was du probiert hast! :mahn:

cu
Narses


whitef - Sa 27.10.07 04:03

hahaha, ich bin anscheinend noch schwerer von begriff... ich finds cool!

ich bekomm diese dcu datei nicht hin.

-habe die pingdemo.zip runtergeladen
-die unit1.pas extrahiert
-die unit1.pas in den order verschoben, in dem auch mein programm drin is
-die unit1.pas in ping.pas unbenannt
-mein programm gestartet und in bei den uses habe ich schön ein komma eingefügt und das wörtschen "ping"



[Fataler Fehler] ping.pas(7): Das Programm oder die Unit 'ping' ruft sich selbst wieder auf



habe eigentlich schon sehr viele varianten ausprobiert um das zu umgehen... es klappt alles nichts.... kann jemand helfen?

mfg


Narses - Sa 27.10.07 14:27

Moin!

user profile iconwhitef hat folgendes geschrieben:
hahaha, ich bin anscheinend noch schwerer von begriff... ich finds cool!

ich bekomm diese dcu datei nicht hin.
Ich merk schon... :?

Ich habe die Ping.pas nochmal extra hochgeladen - für diejenigen, die es nicht schaffen, den Quelltext aus dem Beitrag zu kopieren und als Ping.pas zu speichern... :zwinker: :nut:

cu
Narses


whitef - So 28.10.07 18:00

joa... also im ip-bereich des internen Netzwerks funktioniert diese ping unit einwandfrei.
allerdings wenn ich eien url eingebe und diese in meinem programm als ip wiederrum einlesen lasse, sind dies ip's immer offline.


Delphi-Quelltext
1:
2:
3:
4:
  if ping.Execute(inet_ntoa(IP)) = 0 then
  ShowMessage('Host ist erreichbar!')
  else
  ShowMessage('Host ist Down!!!');


Narses - So 28.10.07 20:21

Moin!

user profile iconwhitef hat folgendes geschrieben:
allerdings wenn ich eien url eingebe und diese in meinem programm als ip wiederrum einlesen lasse, sind dies ip's immer offline.


Delphi-Quelltext
1:
2:
3:
4:
if Ping.Execute(IP) >0 then // IP-Adressen (IP: in_addr) gehen auch direkt
  ShowMessage('Host ist erreichbar!')
else
  ShowMessage('Host ist Down!!!');
Als Ergebnis wird die RTT in Millisekunden geliefert, ein Wert < 0 ist als Fehler/Timeout definiert! :idea:

cu
Narses


Narses - Fr 11.01.08 00:02

Moin!

Bin grad nochmal über das hier gestolpert:
user profile iconreddevil hat folgendes geschrieben:
wenn oft die Funktion ExecuteAsync mit einem unaufgelösten Hostname aufgerufen wird, so steigt der Speicherverbrauch des Programms an. Er scheint linear mit der Anzahl der Aufrufe zu steigen, könnte also irgendwelcher Speicher sein der nicht wieder freigegeben wird.
Wenn anstelle des Hostname die Funktion mit der entsprechenden in_addr Struktur aufgerufen wird, so tritt dieser Effekt nicht auf. Ich würde daher vermuten, dass "der Fehler" zwischen Zeile 688 und 724 liegt (konnte ihn jedoch nicht finden).

Um den oben beschriebenen Effekt festzustellen reicht es in deinem PingDemo Programm einen Host (z.B. http://www.heise.de) etwa 20mal in die Hostliste hinzufügt und anschließend mehrfach asynchron anzupingen. Den Speicherbedarf kann man dabei im Taskmanager beobachten.

user profile iconLuckie hat folgendes geschrieben:
es ist ein Fehler in deinem Code. Du hast wahrschenlich da irgendwo ein Speicherleck.

user profile iconreddevil hat folgendes geschrieben:
Daher könnte es vielleicht auch an irgendwelchen "nicht thread-sicheren" Windowsfunktionen liegen.

user profile iconNarses hat folgendes geschrieben:
user profile iconreddevil hat folgendes geschrieben:
An einen "Fehler" im MemoryManager will ich nicht glauben, allerdings weiss ich auch nicht woran es liegt.

Von einem Fehler redet auch niemand, da aber in der Hostname-Variante Strings auf den [...] Heap gelegt werden und die Threads nicht alle synchron dazu terminieren, wird es einfach ein "Schweizer-Käse"-Problem sein, schätze ich. Wenn du in Zeile 637 "Hostname" durch '' ersetzt, tritt der Speicher-Effekt auch nicht mehr (so) auf (in meinem 2. Test-Programm, dass nur den Call macht).

Fazit: IMHO ist da kein Speicherleck, das ist ein Thread-Heap-Problem mit den Strings (prinzipbedingt).

Deshalb habe ich mal grade eben das Demoprogramm mit MemCheck [http://v.mahon.free.fr/pro/freeware/memcheck/] kompiliert, getestet und kann damit jetzt auch im gleichen Brustton der Überzeugung wie user profile iconLuckie behaupten:

Laut MemCheck ist die Unit fehlerfrei, es ist kein Speicherleck! :D

cu
Narses


TKoASF_Morphix - Mo 26.01.09 13:06

HiHo @ ALL

ich bin der neue und komm jetzt öffter :D

Ich wollte die Komponente in meine bestehende App integrieren und
bin dabei wie oben schon mehrfach geschlidert vorgegangen.

PAS-Datei ins App-Folder kopieren, als Uses hinzufügen und natürlich Procedure schreiben.

Wenn ich jetzt allerding die ganze Sache durch den Kompiler jage sagt der mir das er die ping.dcu
nicht findet...

also legt er sie leider auch nicht wie von Narses beschrieben an...

Hat einer ne Idee warum?
Oder hab ich den N00b-Zettel am rücken? :D

MfG

Morphix


elundril - Mo 26.01.09 13:19

hallo und :welcome:

was hast du in uses reingeschrieben, wie heißt die .pas-datei bei dir und was für eine Fehlermeldung kommt denn genau?

lg elundril


TKoASF_Morphix - Mo 26.01.09 13:28

Die PAS heißt:
U_Fping.pas

Die Use hab ich entsprechend U_Fping genannt

Fehler in U_Fping:

Fehlermeldung:
[Fataler Fehler] U_Fping.pas(7): Datei nicht gefunden: 'Ping.dcu'

Wenn ich die dann in U_Fping umbenenne kommt

Fehlermeldung:
[Fataler Fehler] U_Fping.pas(7): Das Programm oder die Unit 'U_Fping' ruft sich selbst wieder auf

Schon mal THX 4 Help


Narses - Mo 26.01.09 13:34

Moin und :welcome: im Forum!

user profile iconTKoASF_Morphix hat folgendes geschrieben Zum zitierten Posting springen:
Die PAS heißt:
U_Fping.pas

Die Use hab ich entsprechend U_Fping genannt
Wenn man nicht so genau weiß, wie man Units umbenennt, dann könnte man es ja einfach erstmal mit dem Original-Namen probieren, oder? :zwinker:

Du wirst vermutlich den Anfang der Unit so gelassen haben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// -----------------------------------------------------------------------------  
// ICMP-Echo-API-Wrapper (Ping) für Delphi V1.03 vom 15.12.2005, (C) by Narses  
// -----------------------------------------------------------------------------

unit Ping;

interface
...
Der Unit-Name muss auch als Dateiname verwendet werden, sonst klappt das nicht. :idea:

cu
Narses


elundril - Mo 26.01.09 13:35

Folgende Anleitung:

du löscht deine jetzige Ping-Unit.
Gehst in den ersten Post.
Lädst dir dort die 'Ping.pas' runter und speicherst diese auch als Ping.pas im Programmverzeichnis.
Dann im uses 'Ping' eintragen und das wars schon.

lg elundril

//edit: mist zu spät


TKoASF_Morphix - Mo 26.01.09 13:44

THX...

hab den Fehler schon gefunden...

Ich hab die einzelne PAS noch mal gezogen und mit der funzt es dann auch...

Also hab ich wohl doch den N00b-Zettel :(

Ich hoffe das bleibt nicht an mir hängen.... ;)


elundril - Mo 26.01.09 13:52

keine angst, das forum hat das lösungsmittel für den Klebstoff mit dem der zettel befestigt ist. ;-)

lg elundril


Shyran - Do 08.09.11 13:20

Guten Tag liebe Gemeinde,

ich hab die Demo hier nun auch mal versucht und mich auch bemüht, dass in eigenen Code einzubetten. Aber bereits beim Demo (selber unter Delphi XE kompiliert) und beim simplen Ping auf "localhost" (Vista) bekomme ich

"localhost -> Systemfehler: WSANO_DATA"

als Fehlermeldung. Selbstredend, dass mir die Implementierung nicht so recht gelingen will.

Jemand eine spontane Idee?

LG Shyran


BenBE - Do 08.09.11 13:25

Die WSA beschwert sich über fehlende Daten im Paket.


Narses - Do 08.09.11 22:29

Moin und :welcome: in der Entwickler-Ecke!

user profile iconShyran hat folgendes geschrieben Zum zitierten Posting springen:
(selber unter Delphi XE kompiliert) und beim simplen Ping auf "localhost" (Vista) bekomme ich

"localhost -> Systemfehler: WSANO_DATA"
Die Unit stammte noch aus prä-unicode Zeiten und hatte deshalb ein Problem mit Hostnamen-Strings. Habe ich behoben, die aktuelle Version (wie immer im ersten Beitrag) hat jetzt keine Probleme mehr damit.

cu
Narses


Shyran - Fr 09.09.11 07:56

Vielen Dank für's Willkommen und: Ich probiere das gleich mal aus und gebe Feedback - bis später!

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Da isser wieder ...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
i:= Ping.Execute('192.168.212.253'500);
case i of
     0: Listbox2.Items.Add('192.168.212.253');//Tu das, Ping war supi
    -1: ;//Mach dies (Timeout)
    -2: ;//Mach was anderes (LastError befummeln)
    end;


Obiger Code tut erstmal und wird nun von mir weiter verwurstet. Meinen Dank für die spontane Hilfe - und noch viel (!) größerer Dank für die eigentliche Arbeit am Wrapper, Narses *verbeug*. Bestimmt komme ich hier nochmal vorbei, sobald ich den asynchronen Ping mal probiere ... Ich ahne da Schwieirgkeiten in der Ausführung.

Grüße

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for j:=2 to 254 do begin

i:= Ping.Execute('192.168.212.'+IntToStr(j), 500);
case i of
     0: Listbox2.Items.Add('192.168.212.'+IntToStr(j));//Tu das, Ping war supi
    -1: ;//Mach dies (Timeout)
    -2: ;//Mach was anderes (LastError befummeln)
    end;
  end;


Frühstück vorbei, das läuft nun. Ich nehme an, es wäre an dieser Stelle deutlich sinnvoller, die andere Ping-Funktion (asynchrone) zu nutzen, der Aufruf und die Callback Funktion sind mir dabei aber noch unklar, das muss ich zunächst noch verstehen. Obiger Code-Schnippsel liefert mir unbefriedigende Ergebnisse. In meiner Listbox tauchen nur wenige Adressen auf, im eigenen Subnet aber sind deutlich mehr vertreten.

Ein kleiner Schubs in Richtung der Nutzung der ansynchronen Funktion wäre hilfreich für mich.

Danke!


Narses - Fr 09.09.11 12:00

Moin!

user profile iconShyran hat folgendes geschrieben Zum zitierten Posting springen:
Meinen Dank für die spontane Hilfe - und noch viel (!) größerer Dank für die eigentliche Arbeit am Wrapper, Narses *verbeug*.
:beer: ;)

user profile iconShyran hat folgendes geschrieben Zum zitierten Posting springen:
Ich nehme an, es wäre an dieser Stelle deutlich sinnvoller, die andere Ping-Funktion (asynchrone) zu nutzen,
Jup, dafür ist das gedacht.

user profile iconShyran hat folgendes geschrieben Zum zitierten Posting springen:
der Aufruf und die Callback Funktion sind mir dabei aber noch unklar, das muss ich zunächst noch verstehen.
[...]
Ein kleiner Schubs in Richtung der Nutzung der ansynchronen Funktion wäre hilfreich für mich.
Dazu habe ich die Demo-Anwendung geschrieben, dort wird auch der asynchrone Ping eingesetzt, einfach mal im ersten Beitrag reinsehen. :les: :think:

user profile iconShyran hat folgendes geschrieben Zum zitierten Posting springen:
Obiger Code-Schnippsel liefert mir unbefriedigende Ergebnisse. In meiner Listbox tauchen nur wenige Adressen auf, im eigenen Subnet aber sind deutlich mehr vertreten.
Standard-Timeout sind 1000ms, zum Einen. Zum Anderen gibt es bei massiven Ping-Requests manchmal probleme mit Intrusion-Detection-Systemen, die blocken sowas dann. Auch die sonstige Netzauslastung kann eine Rolle spielen, ICMP-Pakete sind ja wie UDP volatil. :nixweiss:

cu
Narses


Shyran - Fr 09.09.11 13:44

Angeschaut habe ich die Demo selbstverständlich (hatte ja geschrieben, dass ich sie selbst auch compiliert hatte, zum Testen), aber noch "Erfurcht" vor der Anwendung besaß. Nun habe ich mir nach Deinem letzten Beitrag Deine Demo mal vorgenommen ... und möchte - insbesondere auch für die anderen Nutzer und vlt. auch "Anfänger", darstellen, wie ich das nun nutze. Das gehört in diesem Forum bestimmt auch zum guten Ton (bin ja neu).

Also zunächst in den Deklarationen meines Programms hinzu:


Delphi-Quelltext
1:
procedure PingResult(Result: TAsyncPingResult);                    

Auf Knopfdruck dann wird der Ping auf das Subnet losgelassen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm2.Button2Click(Sender: TObject);
var i,j,RefID :integer;
begin
RefID:=1;
   for j:=2 to 254 do
   begin
     Ping.ExecuteAsync(RefID,'192.168.212.'+IntToStr(j),PingResult);
   end;
end;


Um dann im Anschluss zu einem kleinen Teil ausgewertet zu werden. Mich interessierte in diesem Fall nur, ob Datensammler an meinem GPRS-Router hingen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.PingResult(Result: TAsyncPingResult);
begin
  if Result.ErrorCode=0 then
    begin
      Listbox2.Items.Add(inet_ntoa(Result.IPv4));
    end;
end;


Begeistert war ich insb. von der Geschwindigkeit, in der meine Listbox sich auffüllte - echt toll!

Nohchmal dickes danke an Narses. Es sieht alles am Ende so einfach aus ...

-Shyran


Enricoffo - Di 19.11.13 22:57

Hallo,

ist ja schon eine Weile her, daher meine Frage:
Gibt es schon ein Update der Unit, wo auch IP V6 unterstützt wird?


Narses - Di 19.11.13 23:40

Moin und :welcome: im Forum!

user profile iconEnricoffo hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es schon ein Update der Unit, wo auch IP V6 unterstützt wird?
Nein, gibt es bisher nicht und habe ich auch (bisher) nicht geplant. :nixweiss:

Aber ist ja open-source, also immer gerne ran an die Buletten. ;)

cu
Narses


jaenicke - Sa 10.01.15 07:21

In der Demo ist übrigens im Formular Position auf poDesktopCenter statt poScreenCenter gesetzt. Mit einer geraden Anzahl von Bildschirmen ist das schlecht, weil das Fenster genau zur Hälfte auf dem einen und zur Hälfte auf dem anderen Monitor ist.
Das beeinträchtigt die Demo nicht, ist aber ja auch leicht zu ändern. ;-)

Nebenbei ist die Demo ein sehr gutes Beispiel für den Bug in Delphi 7 bezüglich des Fensterrahmens. Die angehängte Exe sieht unter XP richtig aus, aber ab Vista nicht mehr... (siehe am rechten und unteren Rahmen)

Delphi7BorderError


jaenicke - Fr 16.01.15 09:53

Hier übrigens eine Lösung für Delphi 7 für das Randproblem:
http://www.entwickler-ecke.de/viewtopic.php?p=691804