socket_select warning

Status
Niet open voor verdere reacties.

janmulder13

Gebruiker
Lid geworden
15 sep 2009
Berichten
43
Hallo,

Ik probeer al een tijdje een werkende socketserver te maken. Eerst heb ik er eentje in C gemaakt (die werkte), maar ons netwerk is daar blijkbaar niet erg geschikt voor. Dus heb ik hem (met een tutorial PHP) geconverteerd naar een PHP bestandje:
Code:
<html>
<?php
$Port = 50505;
$MaxData = 16;

function printos($text) {
echo $text;
error_log($text,0);
}

$AllDS = array_fill(0,4,123);
$ReadDS = array_fill(0,4,123);
$WriteDS = NULL;
$ExceptDS = NULL;
$players = 0;
$eigensocket = 0;
$buffersocket = 0;
$buffer = array_fill(0,$MaxData,0);
$err = 0;
$grootstesocket = 0;
$socketnumber = 0;

function stop() {
while(true);
}

function fd_set($sock, $sockarr) {
$sockarr[$socketnumber] = $sock;
$socketnumber++;
}

function fd_isset($sock, $sockarr) {
$i = 0;
$rv = false;
for ($i=0;$i<$socketnumber;$i++) {
if ($sockarr[i] == $sock) $rv = true;
}
return $rv;
}

function fd_clr($sock, $sockarr) {
$i = 0;
for ($i=0;$i<$socketnumber && $sockarr[i]!=$sock;$i++);
while ($i<$socketnumber) {
$sockarr[i] = $sockarr[i+1];
}
$sockarr[$socketnumber] = -1;
$socketnumber--;
}

$eigensocket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_block($eigensocket);
if ($eigensocket == false) {
printos("socket_create error <br>" . socket_last_error() . "<br>");
}else{
printos("socket ok<br>socket number: " . $eigensocket . "<br>");
}

$err = socket_bind($eigensocket,"127.0.0.1",$Port);
if ($err == false) {
printos("socket_bind error <br>" . socket_last_error() . "<br>");
}else{
printos("bind ok<br>");
}

$err = socket_listen($eigensocket, 10);
if ($err == false) {
printos("socket_listen error <br>" . socket_last_error() . "<br>");
}else{
printos("listening...<br>");
}

fd_set($eigensocket, $AllDS);
$grootstesocket = $eigensocket;
while (true) {
$ReadDS = array($eigensocket,$AllDS[1],$AllDS[2]);
$err2 = socket_select($ReadDS,$WriteDS=NULL,$ExceptDS=NULL,4);
if (false === $err2) {
printos("socket_select error<br>" . socket_last_error() . "<br>");
break;
}else if ($err2 > 0) {
printos("ok");
break;
if (fd_isset($eigensocket, $ReadDS)) {
$buffersocket = socket_accept($eigensocket);
if ($buffersocket == false) {
printos("socket_accept error<br>" . socket_last_error() . "<br>");
}else{
printos("connected<br>");
$players++;
printos("players: " . $players . "<br>");
fd_set($buffersocket, $AllDS);
if ($buffersocket>$grootstesocket) $grootstesocket = $buffersocket;
}
}
for($i=0;$i<=$grootstesocket;$i++) {
if ($players == 1 && $i != $eigensocket && fd_isset($i, $AllDS)) {
socket_send($i,$buffer,1,0);
}
if (fd_isset($i, $ReadDS) && $i != $eigensocket) {
printos("receiving...<br>");
$aantalbytes = socket_recv($i,$buffer,$MaxData,0);
if ($aantalbytes <= 0) {
printos(socket_last_error() . "caused the server to disconnect<br>");
socket_close($i);
fd_clr($i,$AllDS);
$players--;
printos($players);
}else{
printos("received " . $aantalbytes . " bytes<br>");
$buffer[$MaxData-1] = $players;
for ($j=0;$j<$grootstesocket;$j++) {
if ($j!=$i && $j!=$eigensocket && fd_isset($j,$AllDS)) {
socket_send($j, $buffer, $MaxData, 0);
}
}
}
}
}
}else{
printos("no changes");
break;
}
}
?>
</html>
(de break;'s staan er gewoon even voor de handigheid, anders staat error_log helemaal vol)

Deze heb ik geupload naar een webserver (dsserver.net63.net). Als ik hem in de browser intyp (dsserver.net63.net/Server.php) dan krijg ik dit:

socket ok
socket number: Resource id #8
bind ok
listening...

PHP Error Message

Warning: socket_select(): supplied argument is not a valid Socket resource in /home/a2404375/public_html/Server.php on line 77

Free Web Hosting
no changes

Uiteindelijk geeft socket_select dus geen 'false' terug. Dat zou betekenen dat hij het toch doet...

Hoe los ik deze waarschuwing op? maakt het überhaupt iets uit voor de werking van de server?

Alvast bedankt.
 
Je read array bevat {socket} , 4, 123. Tenzij ik iets gemist heb zijn 4 en 123 geen geldige aangemaakte sockets.
 
Ik heb al vanalles geprobeerd en ik krijg ook nog deze warning:

Warning: socket_select() [function.socket-select]: no resource arrays were passed to select in /home/a2404375/public_html/Server.php on line 79

als ik maar één socket in $ReadDS zet. Dit vind ik erg irritant aangezien ik in het begin maar één socket heb. Daarom had ik er maar voor gezorgd dat hij automatisch in ieder geval twee sockets heeft, zodat het in ieder geval één warning oplost. Dit had ik gedaan door 123 toe te voegen aan de array...

Dus ik denk eerder dat het probleem is dat ik in het begin maar één socket heb. En dat trekt hij niet.

Weet iemand een oplossing?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan