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":
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_INET, SOCK_STREAM, SOL_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($socket, SOL_SOCKET, SO_REUSEADDR, 1);
#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'], 384, PHP_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;
}
}
}
}
?>
Kommentar