Ankündigung

Einklappen
Keine Ankündigung bisher.

php Socket Server, nicht mehr verbundenen Client aus array entfernen

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • php Socket Server, nicht mehr verbundenen Client aus array entfernen

    Hallo,
    ich bin absoluter Neuling, was php betrifft.
    Wir haben ein Dartprogramm, wo es möglich ist, online gegen andere zu spielen. Dafür nutzen wir in der Regel Direktverbindungen. Da für diese Verbindungen jedoch eine Portfreigabe nötig ist, haben wir auch einen php Socket Server. Nun habe ich diesen auf meinem Raspi am laufen, was auch eigentlich gut funktioniert. Das einzige Problem ist, dass Clients, welche nicht mehr zum Server verbunden sind, im array erhalten bleiben und somit irgendwann die maxClient Anzahl erreicht ist.
    Bitte um Hilfe.
    Hier mal der Code des Socket Servers, dieser Code ist nicht von mir geschrieben sondern ein "Fundstück":
    PHP-Code:
    <?php
    # V10.0  paket size 376 -> 384 (TGame.xTournament, xClientRready) 

    // Set time limit to indefinite execution 
    set_time_limit (0);
    error_reporting(1);
    ini_set('display_errors''1');

    if(!(
    $socket socket_create(AF_INETSOCK_STREAMSOL_TCP)))
    {
        
    $errorcode socket_last_error();
        
    $errormsg socket_strerror($errorcode);

        die(
    "Couldn't create socket: [$errorcode$errormsg \n");
    }

    echo 
    "Socket created \n";

    # lokale IP eintragen!! 
    $address 'xxx.xxx.xxx.xxx';
    $port 9000;
    $max_clients 10;

    socket_set_option($socketSOL_SOCKETSO_REUSEADDR1);

    #socket_bind($socket, 0, 10000); 

    if(!socket_bind($socket$address$port) )
    {
        
    $errorcode socket_last_error();
        
    $errormsg socket_strerror($errorcode);

        die(
    "Could not bind socket : [$errorcode$errormsg \n");
    }

    echo 
    "Socket bind OK \n";



    #socket listen

    if(!socket_listen ($socket $max_clients))
    {
        
    $errorcode socket_last_error();
        
    $errormsg socket_strerror($errorcode);

        die(
    "Could not listen on socket : [$errorcode$errormsg \n");
    }

    echo 
    "Socket listen OK \n";

    echo 
    "Waiting for incoming connections... \n";



    $clients = array('0' => array('socket' => $socket));

    while(
    TRUE)
    {
      
    $read[0] = $socket;

      for(
    $i=1$i<count($clients)+1; ++$i)
      {
        if(
    $clients[$i] != NULL)
        {
          
    $read[$i+1] = $clients[$i]['socket'];
        }
      }

      
    $ready socket_select($read$write NULL$except NULL$tv_sec NULL);

      if(
    in_array($socket$read))
      {
        for(
    $i=1$i $max_clients+1; ++$i)
        {
          if(!isset(
    $clients[$i]))
          {
            
    $clients[$i]['socket'] = socket_accept($socket);
            
    socket_getpeername($clients[$i]['socket'],$ip);
            
    $clients[$i]['ipaddy'] = $ip;
            echo 
    "Client $i : $ip is now connected to us. \n";
            break;
          }
          elseif(
    $i == $max_clients 1)
        {
        echo 
    'To many Clients connected!'."\r\n";
        }
          if(
    $ready 1)
          {
            continue;
          }
        }
      }

      for(
    $i=1$i<$max_clients+1; ++$i)
      {
        if(
    in_array($clients[$i]['socket'], $read))     {
          
    $data socket_read($clients[$i]['socket'], 384PHP_BINARY_READ);
          if(
    $data === Null)
          {
            unset(
    $clients[$i]);
            echo 
    "Client $i : $ip is now disconnented. \n";

            continue;
          }
          if(!empty(
    $data))
          {
            for(
    $j=1$j<$max_clients+1; ++$j)
            {
              if(isset(
    $clients[$j]['socket']))
              {
                if(
    $clients[$j]['socket'] != $socket)
                {
                  
    socket_write($clients[$j]['socket'], $data);
                }
              }
            }
            break;
          }
        }
      }
    }
    ?>

  • #2
    http://phpforum.de/forum/showthread.php?t=284803

    Kommentar


    • #3
      Danke hellbringer für das verlinken auf meine eigene Frage im anderen Forum.
      Wenn Du nun dort hin gehst, erfährst Du, was der Fehler war und das ich ihn selber gefunden habe.

      Thema kann geschlossen werden

      Kommentar


      • #4
        hellbringer hat den Link gepostet, um uns darauf aufmerksam zu machen, dass es sich um CrossPost handelt!
        Solltest Du kennen, da Du die Forenrichtlinien beider Foren akzeptiert hast!

        [MOD: geschlossen]
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar

        Lädt...
        X