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)){ } if(!socket_listen($sckMain)){ } 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){ $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(); if($sCommand != ''){ if($this -> bAuthenticated == true){ if($sCommand == 'logout'){ $this -> disconnect(); }elseif($sExecute == 'echo'){ $this -> send($sParameters); }elseif($sExecute == 'time'){ }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(){ } 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.