regenfeld: Abfrage ob Programm am Client läuft

Hi,

Wie kann ich vom Server aus "abfragen" ob am Client eine gewisse Applikation gestartet/aktiv ist? Wie z.b. bei audiogalaxy.com -- man kann nur runterladen, wenn der Galaxy-Client offen ist. Wenn der Galaxy-Client nicht offen ist, erscheint im Browser (!) eine Fehlerseite, dass man zuerst den Dienst auf seinem PC starten soll.

Es scheint alles darauf hinzudeuten, als käme die Abfrage irgendwie mittels CGI/PHP? Nur ist mir nicht klar, wie der Server auf das Client-System zugreifen kann. Umgebungsvariablen? Sockets? ...?

Wie kann sowas realisiert werden? Erstmal wär mir schon mit einem sprachenunabhängigen Konzept geholfen, idealerweise sollte nachher alles auf Java (Servlet) laufen.

lg regenfeld

  1. Wie kann ich vom Server aus "abfragen" ob am Client eine gewisse
    Applikation gestartet/aktiv ist?

    Das Programm auf dem Client muß wohl schon auf eine Verbindung vom Server warten und die dann auch entsprechend beantworten.
    Auf der Serverseite geht diese Abfrage ganz einfach zum Beispiel in PHP per fsockopen().
    Auf der Clientseite mußt du dich mit dem jeweiligen Betriebssystem oder der Programmierumgebung rumärgern :)

    Gruß,
    soenk.e

    1. Grüssi sönk.e

      Wie kann ich vom Server aus "abfragen" ob am Client eine gewisse
      Applikation gestartet/aktiv ist?

      Das Programm auf dem Client muß wohl schon auf eine Verbindung vom Server warten und die dann auch entsprechend beantworten.

      Nun, die Frage war ja, wie das gehen soll, wenn das Programm nicht läuft. Wenn sich da was zurückmeldet ist mir das klar, aber en soll der Server ansprechen, wenn das Programm nicht offen ist?

      Auf der Serverseite geht diese Abfrage ganz einfach zum Beispiel in PHP per fsockopen().
      Auf der Clientseite mußt du dich mit dem jeweiligen Betriebssystem oder der Programmierumgebung rumärgern :)

      Programmierumgebung wär Java (RMI). Ich hätte vor eine Java-Applikation als Client einzusetzen, die Verbindungen aufnimmt, und wenn der Benutzer das Programm beendet, auch den Client am Server abmeldet. Die ganze Funktionalität soll von Servelts erbracht werden, und somit über Browser ablaufen.

      lg regenfeld

  2. Hi,

    Wie kann ich vom Server aus "abfragen" ob am Client eine gewisse Applikation gestartet/aktiv ist? Wie z.b. bei audiogalaxy.com -- man kann nur runterladen, wenn der Galaxy-Client offen ist. Wenn der Galaxy-Client nicht offen ist, erscheint im Browser (!) eine Fehlerseite, dass man zuerst den Dienst auf seinem PC starten soll.

    Man kann natürlich NICHT feststellen, welche Programme auf dem Rechner laufen. Was das Internet angeht, kann man nur feststellen, ob irgendwelche Programme sich melden, wenn man auf bestimmten Ports anfragt. Jeder Browser realisiert das Prinzip, indem er auf Port 80 anfragt, ob ein Webserver HTML-Seiten senden kann.

    Das Prinzip kann man natürlich auch umkehren, und der Server kann den Client fragen, ob der Client bestimmte Ports offen hat (was den Client in diesem Falle als Server agieren läßt), andernfalls eine Fehlerseite ausgeben. Ich weiß nicht genau, wie Audiogalaxy funktioniert, aber irgendwie müssen die Audiofiles ja getauscht werden, und das geht nur, wenn mindestens ein Server beteiligt ist. ;)

    - Sven Rautenberg

    1. Hallo Sven,

      Das Prinzip kann man natürlich auch umkehren, und der Server kann den Client fragen, ob der Client bestimmte Ports offen hat (was den Client in diesem Falle als Server agieren läßt), andernfalls eine Fehlerseite ausgeben. Ich weiß nicht genau, wie Audiogalaxy funktioniert, aber irgendwie müssen die Audiofiles ja getauscht werden, und das geht nur, wenn mindestens ein Server beteiligt ist. ;)

      hmmm, anders geht das nicht? Schauen ob ein Port offen ist, scheint mir keine sehr zuverlässige Methode. Schliesslich kann ja jedes Programm irgendeinen Port öffnen oder?

      Mein Problem liegt darin, dass der Server ja nicht weiss, um welchen Client es sich handelt. Es müsste, wenn dann so gehen, dass der Server die IP des Client nimmt, und schaut ob auf Port xyz eine Verbindung aufgebaut werden kann. Der Client müsste dann seine ID zurückliefern, dann kann der Server die personalisierte Seite zurückliefern. Ist das vom gedankengang her richtig?

      Nun, es öffnet sich ja nicht einfach so ein Port, den man "abfragen" kann. Wie läuft sowas ab? Irgendeinen Dienst muss der (Web-)Server hinter diesem Port ja ansprechen, von dem er eine Antwort erwartet. Vielleicht gibts da ein kleines Codeschnipsel/Link (Sprache ist egal). Es wär schön, wenn ich jetzt ein wohlklingendes Schlagwort hören würde: RPC, RMI, Sockets, ... ;-)

      lg regenfeld

      PS: Das alles klingt schon sehr gut, aber der Groschen ist noch nicht ganz gefallen, vielleicht kannst du ja nochmal etwas genauer werden (an einem kleinen Beispiel erklärt vielleicht)?

      1. Hallo,

        Eventuell würde es auch so gehen, daß das benötigte Programm eine Verbindung zum Server aufnimmt, und zwar an einem festgelegten Port. Ist diese Verbindung hergestellt, wird am Server dies registriert.
        Beim Abarbeiten des Request vom Browser wird dann kontrolliert, ob eine Verbindung besteht, also das Programm läuft. Über diese Verbindung kann dann der Server die Daten übertragen.

        Ein Grund, warum ich glaube, daß die Verbindung unbedingt vom Client aus geöffnet werden muß, ist dei Möglichkeit, daß der Client ja auch über NAT eine Verbindung öffnen kann, umgekehrt würde es AFAIK nicht gehen, da der Server die tatsächliche IP-Adresse des Clients nicht kennen kann.

        Wobei hier allerdings wiederum das Proiblem mit der eindeutigen Identifizierung wäre.
        Hmmm, schwierig schwierig.

        Grüße
          Klaus

      2. Hallo Sven,

        Das Prinzip kann man natürlich auch umkehren, und der Server kann den Client fragen, ob der Client bestimmte Ports offen hat (was den Client in diesem Falle als Server agieren läßt), andernfalls eine Fehlerseite ausgeben. Ich weiß nicht genau, wie Audiogalaxy funktioniert, aber irgendwie müssen die Audiofiles ja getauscht werden, und das geht nur, wenn mindestens ein Server beteiligt ist. ;)

        hmmm, anders geht das nicht? Schauen ob ein Port offen ist, scheint mir keine sehr zuverlässige Methode. Schliesslich kann ja jedes Programm irgendeinen Port öffnen oder?

        Nein, anders geht es im Prinzip nicht. Man kann es natürlich noch verfeinern, indem Client und Server erstmal eine Programmidentifikation austauschen, bzw. der Client (dein Server) die Serveridentifikation abfragt und dadurch weiß, mit welchem Programm er es zu tun hat.

        Mein Problem liegt darin, dass der Server ja nicht weiss, um welchen Client es sich handelt. Es müsste, wenn dann so gehen, dass der Server die IP des Client nimmt, und schaut ob auf Port xyz eine Verbindung aufgebaut werden kann. Der Client müsste dann seine ID zurückliefern, dann kann der Server die personalisierte Seite zurückliefern. Ist das vom gedankengang her richtig?

        Erstmal muß die Rückwärtsverbindung überhaupt möglich sein. Wie Klaus in seiner Antwort schon schrieb: NAT (Network Adress Translation), Masquerading oder auch Firewalls sind Netzwerkelemente, die meist nur Verbindungen in eine Richtung (vom surfenden Browser zum Webserver) zulassen. Eine umgekehrte Verbindung zum Testen von laufender Software ist dann unmöglich.

        Software wie für Gnutella schafft es trotzdem, diese Hindernisse in beide Richtungen zu umschiffen, indem Rechner hinter solchen "Netzwällen" immer von sich aus die Verbindung aufbauen und unter Umständen von anderen gewünschte Dateien an diese versenden, anstelle sie abrufen zu lassen.

        Nun, es öffnet sich ja nicht einfach so ein Port, den man "abfragen" kann. Wie läuft sowas ab? Irgendeinen Dienst muss der (Web-)Server hinter diesem Port ja ansprechen, von dem er eine Antwort erwartet. Vielleicht gibts da ein kleines Codeschnipsel/Link (Sprache ist egal). Es wär schön, wenn ich jetzt ein wohlklingendes Schlagwort hören würde: RPC, RMI, Sockets, ... ;-)

        Also ganz grundsätzlich: Du mußt auf dem Browser-Client eine Software laufen haben, die sich entweder synchron zum Surfen auch bei deinem Server meldet (wie sie das schafft, ist dein Problem), oder sie öffnet einen Port und läßt sich VIELLEICHT von außen erreichen. Der Webserver erhält dann entweder die Information automatisch, oder er muß zurückkontakten.

        Das alles klappt mit den üblichen Methoden, Sockets zu öffnen und Verbindungen herzustellen. Wie es konkret geht, sagt dir die entsprechende Hilfe der Programmiersprache deiner Wahl. ;)

        lg regenfeld

        PS: Das alles klingt schon sehr gut, aber der Groschen ist noch nicht ganz gefallen, vielleicht kannst du ja nochmal etwas genauer werden (an einem kleinen Beispiel erklärt vielleicht)?

        Kleines Beispiel auch noch? Das sind aber drei Wünsche auf einmal! ;)

        Mal angenommen, auf meinem Rechner läuft eine Sharing-Software, die für gewöhnlich Port 3000 benutzt. Ich surfe auf deine Seite, dein Server kennt dadurch meine IP, und er kann eine Verbindung zu meinem Port 3000 öffnen. Verschiedene Dinge können passieren:
        1. Die Verbindung klappt, dein Server ist glücklich
        2. Die Verbindung klappt nicht,...
          a) weil meine Firewall dich blockt, oder
          b) weil mein Masquerading-Router dich blockt, oder
          c) weil meine Software schon genug Verbindungen offen hat. :)

        Alternativ könnte die Sharingsoftware mein Surfen beobachten und jeweils von sich aus die Server kontakten. Dann müßte dein Webserver lediglich einen zweiten Port offen haben, auf dem sich die Software meldet, die Information (doppelter Kontakt mit Browser und Sharer) verarbeiten und glücklich sein. Mir mißfällt aber die Tatsache, daß da ein Programm meine Tätigkeit überwacht, also würde ich sowas nicht installieren (und es würde auch bei meiner Personal Firewall auffallen, daß nicht nur der Browser Kontakt sucht).

        Letzendlich ist das alles eine unsichere Sache, und nicht verläßlich. Das einzige, auf das du dich verlassen kannst, ist: Wenn ein Browser kommt und Daten will, kannst du ihm welche senden, und diese kommen an. Alles andere ist Glück.

        - Sven Rautenberg