[IPC] Bsp Chat - Kommunitkation zw Prozessen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [IPC] Bsp Chat - Kommunitkation zw Prozessen

    Hi, ich hab mal ne technische frage:

    will will z.b. einen "chat-server" machen. da koennen sich ueber sockets mehrere leute drauf verbinden. fuer jede verbindung wird ein neuer child-prozess erstellt.
    jetzt schicke ich von einer dieser verbindungen eine nachricht an den server, also den jeweiligen child-prozess.

    und jetzt die eigl frage: wie uebertrage ich diese nachricht an alle anderen prozesse?

    bei zwei prozessen ist das ja kein ding. kann man ja z.b. ueber ne pipe/fifo machen. sobald allerdings mehrere verbindungen da sind, wird das ganze rel unuebersichtlich. eine idee war es, einen master-prozess zu haben, der das zw den prozessen hin- und herverteilt. aber auch da wieder die frage, wie ich das uebertrage. hab mir auch mal gedanken zum stichwort "gemeinsamer speicherbereich" gemacht, bin da aber auf keine konkrete idee gekommen.

    vielen dank im vorraus, mfg
    www.myplaner.de

  • #2
    sprechen wir über PHP oder eine andere Sprache?
    mit PHP ist klar, man sendet eine anfrage, und bekommt ein antwort. An dieser stelle ist PHP script abgelaufen.
    was anderes ist AJAX, der immer wieder die anfrage an den PHP script sendet, der Script identifiziert den User und sendet im als antwort alle veränderungen, die seit seiner letzter Anfrage vorgekommen sind.
    Meine Meinung nach ist http protokol nicht unbedingt für solche zwecke geeignet.
    Slava
    bituniverse.com

    Kommentar


    • #3
      naja, man kann ja php auch als daemon/server laufen lassen...

      waer mir eigl rel angenehm, weil ich alle funktionen bei meinem projekt in dateien ausgelagert hab und gelegentlich veraender. da waers ja schon ganz nett, wenn ich den server via php realisieren koennte. (also aus der kommando-zeile starten => erste zeile "#!/usr/bin/php")

      abgesehen davon, ist es eigl rel egal in welcher sprache man es macht... die frage fuer mich ist eher das WIE... obwohl ich es sicherlich in php realisieren will. und sobald ich eine ahnung hab WIE, wird dazu auch sicher wieder eine frage aufkommen! ^^

      mfg

      p.s.
      http://de.php.net/manual/de/ref.sockets.php
      http://de.php.net/manual/de/function.pcntl-fork.php
      Zuletzt geändert von extr3m0; 12.03.2007, 23:05.
      www.myplaner.de

      Kommentar


      • #4
        also falls es jmd interessiert, hab irgendwo bei den user-beispielen der php-doc folgendes script gefunden:
        mit diesem script ist es moeglich ohne fork mehrere socket-verbindungen mit einem script/prozess/thread zu handlen:

        PHP-Code:
        #!/usr/bin/php -q
        <?php
        error_reporting
        (E_ALL);

        set_time_limit(0);
        ob_implicit_flush();

        $address '127.0.0.1';
        $port 8888;

        function 
        handle_client($allclient$socket$buf$bytes) {
           foreach(
        $allclient as $client) {
               
        socket_write($client"$socket wrote: $buf");
           }
        }

        if ((
        $master socket_create(AF_INETSOCK_STREAMSOL_TCP)) < 0) {
           echo 
        "socket_create() failed: reason: " socket_strerror($master) . "\n";
        }

        socket_set_option($masterSOL_SOCKET,SO_REUSEADDR1); 

        if ((
        $ret socket_bind($master$address$port)) < 0) {
           echo 
        "socket_bind() failed: reason: " socket_strerror($ret) . "\n";
        }

        if ((
        $ret socket_listen($master5)) < 0) {
           echo 
        "socket_listen() failed: reason: " socket_strerror($ret) . "\n";
        }

        $read_sockets = array($master);

        while (
        true) {
           
        $changed_sockets $read_sockets;
           
        $num_changed_sockets socket_select($changed_sockets$write NULL$except NULLNULL);
           foreach(
        $changed_sockets as $socket) {
               if (
        $socket == $master) {
                   if ((
        $client socket_accept($master)) < 0) {
                       echo 
        "socket_accept() failed: reason: " socket_strerror($msgsock) . "\n";
                       continue;
                   } else {
                       
        array_push($read_sockets$client);
                   }
               } else {
                   
        $bytes socket_recv($socket$buffer20480);
                   if (
        $bytes == 0) {
                       
        $index array_search($socket$read_sockets);
                       unset(
        $read_sockets[$index]);
                       
        socket_close($socket);
                   } else {
                       
        $allclients $read_sockets;
                       
        array_shift($allclients);    // remove master
                       
        handle_client($allclients$socket$buffer$bytes);
                   }
               }
               
           }
        }

        ?>
        www.myplaner.de

        Kommentar

        Lädt...
        X