Entwickler-Ecke
Internet / Netzwerk - Überprüfen ob meine Anwendung bereits woanders im Netzwerkt
T.E. - Di 23.11.10 16:57
Titel: Überprüfen ob meine Anwendung bereits woanders im Netzwerkt
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
Xion - 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 ;)
Gerd Kayser - 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 - Di 23.11.10 21:28
Das mit den Dateien ist eine äußerst unsaubere Sache. Lösungsansatz wurde ja bereits zuvor beschrieben.
Gerd Kayser - 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. - 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 :)
Xion - 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 ;)
jaenicke - 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...
Martok - 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.
T.E. - 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 :oops: )Verwendungszweck nicht praktikabel... :roll:
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. |
:idea: 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: http://www.delphi-treff.de/tutorials/netzwerk-und-internet/sockets-mit-winapi/socketoptionen-und-udp-broadcast/
bummi - 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??
T.E. - 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?
bummi - 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?
platzwart - 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...
T.E. - So 28.11.10 17:34
bummi hat folgendes geschrieben : |
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 wäre natürlich auch eine Idee.
platzwart hat folgendes geschrieben : |
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... |
würde bei einer Verbindung innerhalb eines Programms mit sicherheit einwandfrei funktionieren (dabei ließe sich aber auch einfach die IdFTP.connected abfragen. Gemeint ist aber wie man aus dem Programm abfragen kann, ob auf einem Server bereits eine ANDERE Anwendung angemeldet ist. :)
MAlsleben - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!