Autor |
Beitrag |
T.E.
      
Beiträge: 31
Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
|
Verfasst: Di 23.11.10 16:57
Moin moin,
zur Zeit bin ich mal wieder an der Lösungsfindung: und zwar geht es diesmal darum, das ich abfragen möchte, ob irgendwo im Netzwerk (auf vorgegebenen Rechnern) mein Programm bereits läuft.
Mir war bisher nur eine Möglichkeit eingefallen, die aber einige Probleme mit sich bringt.
Diese Lösung wäre einfach ein 0-Byte File an einem festen Ort im Netzwerk zu erstellen und beim Programm start´abzufragen ob dieses existiert oder nicht. PROBLEM: wenn das erstellende Programm abstürzt würde das File nicht gelöscht werden und keine Anwendung könnte mehr drauf zugreifen.
hat einer von Euch zufällig eine andere oder bessere Idee für das Hauptproblem (zu ermitteln ob die Anwendung bereits im Netzwerk läuft)?
Besten Dank für kreative Denkanstöße,
Torben
_________________ Schöne Grüße,
Torben
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 23.11.10 17:08
Aus technischer Sicht müsstest du einfach einen Broadcast senden können, den kriegen dann alle Rechner. Dein Programm lauscht an einem Port und wenn dort was kommt, dann antwortet es. Wie genau das umzusetzen ist...gute Frage. Irgendwie mit den Sockets 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Tankard
      

Beiträge: 217
Erhaltene Danke: 96
|
Verfasst: Di 23.11.10 17:13
gibt ne nette komponente dafuer.
wiki.lazarus.freepascal.org/OnGuard
viel spass beim testen.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 23.11.10 21:25
T.E. hat folgendes geschrieben : | PROBLEM: wenn das erstellende Programm abstürzt würde das File nicht gelöscht werden und keine Anwendung könnte mehr drauf zugreifen. |
Schon mal CreateFile in Verbindung mit File_Flag_Delete_on_Close versucht?
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 23.11.10 21:28
Das mit den Dateien ist eine äußerst unsaubere Sache. Lösungsansatz wurde ja bereits zuvor beschrieben.
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 23.11.10 22:10
platzwart hat folgendes geschrieben : | Das mit den Dateien ist eine äußerst unsaubere Sache. Lösungsansatz wurde ja bereits zuvor beschrieben. |
Meine Antwort bezog sich lediglich auf das Problem, daß eine Datei nicht gelöscht wird, wenn das Programm abstürzt.
|
|
T.E. 
      
Beiträge: 31
Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
|
Verfasst: Mi 24.11.10 08:59
Vielen Dank für eure Ansätze  auch für deinen Hinweis auf File_Flag_Delete_on_Close.
Ich werd zunächst mal die OnGuard Komponente von Tankard testen. Und mir sonst wohl mit Xion's Ansatz eine Lösung basteln, sofern nicht noch andere Lösungsansätze auftauchen 
_________________ Schöne Grüße,
Torben
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 24.11.10 10:36
Die Geschichte mit der Datei...wäre es nicht umgedreht ganz gut?
Ich erstelle die Datei und warte. Wird sie NICHT gelöscht, dann ist keine andere Instanz meines Programmes aktiv. Damit würde man den Deadlock verhindern 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 24.11.10 10:43
Und wenn sie in dem Moment, in dem du prüfst, von einer anderen Instanz aus dem selben Grund wieder erstellt wurde?
Das ist alles keine sinnvolle Lösung...
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.11.10 13:39
Mittels WMI kann man auch eine Prozessliste eines Rechners im Netzwerk bekommen: www.michael-puff.de/...mierung/Delphi/Demos -> WMIEnumProcesses.zip
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 24.11.10 14:06
Xion hat folgendes geschrieben : | Die Geschichte mit der Datei...wäre es nicht umgedreht ganz gut?
Ich erstelle die Datei und warte. Wird sie NICHT gelöscht, dann ist keine andere Instanz meines Programmes aktiv. Damit würde man den Deadlock verhindern  |
Das macht Minecraft fürs Locking, wenn ich das richtig verstanden hab.
Es wird eine Datei bestimmten Namens erstellt und exklusiv geöffnet. Geht das nicht, ist jemand anders da.
Datei wird mit Signatur/Timestamp/irgendwas gefüttert. Dann wird sie wieder geschlossen.
Nach Zeit N wird die Datei wieder exklusiv geöffnet. Ist immer noch der gleiche Inhalt drin, ist man der einzige. Wenn man sie nicht auf bekommt, hat jemand anders das Lock gewonnen. Hat man sie und stimmt der Inhalt, ist man offenbar allein und kann sich austoben.
Am Ende wird die dann irgendwie gelöscht oder geleert, das weiß ich so direkt nicht wie es genau umgesetzt ist.
Das benutzen die, damit immer der zuletzt Anfragende gewinnt: seins Signatur steht halt in der Datei.
Schöner wäre natürlich die Variante mit Broadcasts, aber: je nach Netz muss das nicht funktionieren. Gerade Firmennetze lassen manchmal Broadcasts nur beschränkt zu.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
T.E. 
      
Beiträge: 31
Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
|
Verfasst: Mi 24.11.10 16:43
Mir ist gerade aufgefallen, das ich meine Frage noch etwas spezialisieren muss: und zwar muss nicht nur überprüft werden ob die Anwendung überhaupt irgendwo im Netzwerk läuft, sondern auch, ob diese die zwei bis drei FTP-Verbindungen aufgebaut hat.
Mit dieser Lösung ließe sich dann die Hauptfrage beantworten.
Martok hat folgendes geschrieben : | [...]Es wird eine Datei bestimmten Namens erstellt und exklusiv geöffnet. Geht das nicht, ist jemand anders da.
Datei wird mit Signatur/Timestamp/irgendwas gefüttert. Dann wird sie wieder geschlossen.
Nach Zeit N wird die Datei wieder exklusiv geöffnet. Ist immer noch der gleiche Inhalt drin, ist man der einzige. Wenn man sie nicht auf bekommt, hat jemand anders das Lock gewonnen. Hat man sie und stimmt der Inhalt, ist man offenbar allein und kann sich austoben.
Am Ende wird die dann irgendwie gelöscht oder geleert, das weiß ich so direkt nicht wie es genau umgesetzt ist.
Das benutzen die, damit immer der zuletzt Anfragende gewinnt: seins Signatur steht halt in der Datei.[...] |
Wäre eine interessante Möglichkeit aber wohl für meinen (ergänzten  )Verwendungszweck nicht praktikabel...
Martok hat folgendes geschrieben : | [...]Schöner wäre natürlich die Variante mit Broadcasts, aber: je nach Netz muss das nicht funktionieren. Gerade Firmennetze lassen manchmal Broadcasts nur beschränkt zu. |
 Einen Broadcast senden müsste doch theoretisch mit den TCP Indys gehen oder? Mit dem Broadcast in Verbindung mit Luckie's Vorschlag ließe sich dann überprüfen, ob der Prozess läuft und wenn dieser bereits läuft soll nachgeforscht werden ob dieser Broadcast besteht, wenn ja dann darf halt keine Verbindung aufgebaut werden...
Ergänzung: www.delphi-treff.de/...n-und-udp-broadcast/
_________________ Schöne Grüße,
Torben
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 24.11.10 17:03
Zitat: | Mir ist gerade aufgefallen, das ich meine Frage noch etwas spezialisieren muss: und zwar muss nicht nur überprüft werden ob die Anwendung überhaupt irgendwo im Netzwerk läuft, sondern auch, ob diese die zwei bis drei FTP-Verbindungen aufgebaut hat. |
Geht es bei der FTP-Verbindung immer um den gleichen Server, was soll eine Programm tun wenn das andere noch nicht verbunden ist und es irgendwann tut?
Kannst Du falls es sich um denselben Zielserver handelt nicht einfach hierüber Steuern ob das Programm weiterläuft.
Verbindungsversuch zum Server, der meldet es besteht bereits eine Verbindung und gut ist??
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
T.E. 
      
Beiträge: 31
Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
|
Verfasst: Mi 24.11.10 17:24
bummi hat folgendes geschrieben : | Geht es bei der FTP-Verbindung immer um den gleichen Server, was soll eine Programm tun wenn das andere noch nicht verbunden ist und es irgendwann tut? |
Diese Frage muss ich mit einem Jaein beantworten...
Und zwar macht das Programm FXP. Alle Anwendungen haben im Prinzip(!!) die selbe Quelle - praktisch hat jede Anwendugn eine bestimmte IP mit der sie arbeitet. Auf der Zielseite sieht es hingegen so aus, das wir dort in Fall 1 zwei Server haben und im Fall 2 nur noch einen einzigen. Wenn eine Verbindung aufgebaut ist, so ist diese solange aktiv bis die Verbindung getrennt wird, das Programm beendet wird oder höhere Mächte walten; da ich einen Verbindungserhaltungsbefehl sende.
bummi hat folgendes geschrieben : | Kannst Du falls es sich um denselben Zielserver handelt nicht einfach hierüber Steuern ob das Programm weiterläuft.
Verbindungsversuch zum Server, der meldet es besteht bereits eine Verbindung und gut ist?? |
Wie kann man denn bei einem FTP-Server (der keine Doku hat) melden lassen, ob bereits eine Verbindung besteht?
_________________ Schöne Grüße,
Torben
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 24.11.10 18:02
Ich kenne deine Möglichkeiten und Anforderungen zu wenig...
Gibt es eine Möglichkeit eine Dienst aufzusetzen der vom Programm per TCP einen Heartbeat bekommt und der dann entscheidet ob ein weiteres Programm ebenfalls gestartet werden darf?
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mi 24.11.10 18:25
T.E. hat folgendes geschrieben : |
Wie kann man denn bei einem FTP-Server (der keine Doku hat) melden lassen, ob bereits eine Verbindung besteht? |
Indem du einfach so tust, als gäbe es eine Verbindung. Z.B. forderst du eine Datei an. Wenn die Verbindung nicht steht, wirst du ja sicherlich einen Fehler erhalten? Den kannst du dann ja abfangen...
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
T.E. 
      
Beiträge: 31
Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
|
Verfasst: So 28.11.10 17:34
_________________ Schöne Grüße,
Torben
|
|
MAlsleben
      
Beiträge: 303
W2k,WinXP
D3 - DXE3 Enterprise
|
Verfasst: Di 30.11.10 12:42
Hi,
lass die Finger von Broadcast für deine Programmfunktion.
1. In größeren Netzen bzw. Netzen mit mehreren VLAN's wird es über die VLAN's hinweg in den allermeisten Fällen ohnehin unterbunden.
2. Jeder Netzadmin wird dich dafür nicht nur hassen sondern töten.
3. Es gibt leider schon genug, die mit solchem Schwachsinn den Netzen das Leben schwer machen.
Gruß Micha.
_________________ Viele Wege führen nach Rom.
|
|