Daniel Borgmann: Chatserver mit Perl: wie checke ich den clienten?

Ich habe folgendes Problem:
Mit Perl habe ich einen Chatserver programmiert, der pro User einen Prozess erzeugt und dann in einer Endlosschleife eine Datei ausliest und gegebenenfalls den Chattext anzeigt.
Diese Endlosschleife soll natürlich unterbrochen werden, wenn der User nicht mehr Empfangen kann (weil offline oder Fenster geschlossen).
Wie kann ich also prüfen, ob der Benutzer noch "da" ist?

Den Socket habe ich in etwa folgendermaßen erzeugt:

use IO:Socket;
$server = new IO::Socket::INET (LocalHost => $servername,
   LocalPort => $port,
   Listen    => SOMAXCONN,
   Proto   => 'tcp',
   Reuse   => 1);
while ($socket = $server->accept()) {
    $pid = fork();
    if ($pid == 0) {
# Kindprozess
$go = 1;
while ($go && defined($buf = <$socket>)) {
     &server;
}
exit(0);
    }
}
close($server);

In server() wird dann die Endlosschleife gestartet.

Falls jemand eine Idee hat, bitte melden! Ich hab nämlich keine...

Gruß, Daniel

  1. Hallo Daniel,

    Der Client müsste in regelmäßigen Abständen ein Signal zum Server schicken, um dem mitzuteilen, daß er noch da ist. Wenn eine Weile kein Signal kommt, ist wohl niemand mehr da und Du kannst den Prozess beenden.
    Wenn Du auf der Clientseite ein Applet oder Plugins hast, müsste das relativ problemlos gehen.  Der Client sendet halt regelmäßig sein Signal.
    Wenn auf der Clientseite nur HTML/Javascript ist, dann musst Du das Signal halt per CGI-Aufruf machen. Zum Beispiel für den Darstellungsrefresh (in einem Frame beispielsweise) verwendest Du ja vielleicht folgendes:
    <meta http-equiv="refresh" content="3; URL=http://www.irgendwas.de/cgi-bin/chatinhalt_anzeigen.pl">
    oder so. Wenn Du dann noch jedem Nutzer eine ID-Nummer zuordnest, kannst Du leicht feststellen, ob er noch da ist: Das könnte z.B. so aussehen:
    <meta http-equiv="refresh" content="3; URL=http://www.irgendwas.de/cgi-bin/chatinhalt_anzeigen.pl?identifikationsnummer">

    Da Du ja das META-Tag selbst per Perlscript erzeugst, ist das also kein Problem.

    Ja, daß ist die Lösung die mir so spontan einfällt. Vielleicht hilft Dir das ja.

    Gruß
       Michael