Witam!
Chciałem postawić prosty serwer w php oparty na gniazdkach, i działa przez 10s (da się do niego podłączyć itd.), a potem się wyłącza - i "nasłuchiwanie" poprostu nie działa (klient nie może się już połączyć)...
Tutaj kod:
<?php
if (!$sckMain=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)){
}
//socket_set_option($sckMain, SOL_SOCKET, SO_REUSEADDR, 1);
if(!socket_bind($sckMain, '87.98.x.x', 8989)){
trigger_error('Error binding socket to TCP host:'.$host.', port:'.$port.'',E_USER_ERROR
); }
if(!socket_listen($sckMain)){
trigger_error('Error listening socket connections',E_USER_ERROR
); }
while(true){
$sckaRead[0] = $sckMain;
foreach($oaClients as $x => $oClient){
if($oClient -> bClosed == true){
}else{
$sckaRead[] = $oClient -> sckSocket;
}
}
socket_select($sckaRead, $null = null, $null = null, 0);
$sckNewClient = socket_accept($sckMain);
$oaClients[] = new clientHandler($sckNewClient);
}
foreach($oaClients as $oClient){
if(in_array($oClient -> sckSocket, $sckaRead)){ $oClient -> handle();
}
}
}
//socket_close($sckMain); //Sprawdzałem z tą linijką, jak i bez niej (odpowiada za zamknięcie głównego \"gniazdka\")
class clientHandler{
var $bClosed = false;
var $sckSocket = '';
var $bAuthenticated = false;
function clientHandler($sckSocket){
$this -> sckSocket = $sckSocket;
$this -> send('HELLO');
}
function handle(){
$sCommand = $this -> read();
list
($sExecute, $sParameters) = explode(' ', $sCommand, 2
); if($sCommand != ''){
if($this -> bAuthenticated == true){
if($sCommand == 'logout'){
$this -> disconnect();
}elseif($sExecute == 'echo'){
$this -> send($sParameters);
}elseif($sExecute == 'time'){
$this -> send(date('Y-m-d H:i:s')); }else{
$this -> send('unknown command');
}
}elseif($sExecute == 'login'){
if($sParameters == 'hasło'){
$this -> bAuthenticated = true;
$this -> send('login ok');
}else{
$this -> send('login error');
$this -> disconnect();
}
}else{
$this -> send('authenticate first');
}
}
}
function send($sMessage){
socket_write($this -> sckSocket, $sMessage . \"r\n\" . chr(0));
}
function read(){
return trim(@socket_read
($this -> sckSocket, 1024
)); }
function disconnect(){
$this -> send('bye');
$this -> bClosed = true;
socket_close($this -> sckSocket);
}
}
?>
Prawdopodobnie któraś linijka powoduje to przerwanie, lub może to wina serwera (mam hosting na osemka.pl), chociaż gniazdka działają na nim. Z góry dzięki za pomoc w naprawieniu/odnalezieniu błędu.
Ten post edytował mar-je 21.01.2009, 13:58:38