
El código se les hará conocido, es el que está en la documentación de PHP, lo que sucede es que casi todo funciona bien y bonito, comunica varios equipos muy velozmente, pero al momento de que yo quiero mandar un mensaje, no me lo manda hasta que alguien mas manda otro mensaje, es decir:
Cuando alguien se conecta, le manda un mensaje a todos de que esa persona se conecto, pero esto no sucede, se queda en espera el mensaje hasta que otra persona escribe algo, solo así el mensaje se manda.
Aqui pongo el código que tengo, lo documento para que no se pierdan
Código :
#!/usr/bin/php -q <? error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); $address='127.0.0.1'; $port=9999; // funcion que me escribe lo que va haciendo, para yo monitorearlo. function escribir($mensaje){ $archivo="control.txt"; $ant=file_get_contents($archivo); $f=fopen($archivo,"w+"); fwrite($f,$ant."[ ".date('Y-m-d H:i:s')." ]\n".$mensaje."\n\n"); fclose($f); } //Ahi manda el mensaje a todos, parece funcionar bien =) function sendTotalMsg($allclient,$socket,$buf){ foreach($allclient as $client){ escribir("Para $client: ".$buf); socket_write($client,"$socket ".date('Y-m-d H:i:s')." escribio: $buf"); } } // Crea un separador en mi archivo de monitoreo $archivo="control.txt"; $ant=file_get_contents($archivo); $f=fopen($archivo,"w+"); fwrite($f,$ant."------------------------------------------[ ".date('Y-m-d H:i:s')." ]\n"); fclose($f); //crea el socket y se conecta, en caso de error, me lo manda a mi archivo de monitoreo if (($master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP))<0){escribir("socket_create() FALLA:\n\t".socket_strerror($master));}else{escribir("socket_create() OK");} socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1); if (($ret=socket_bind($master,$address,$port))<0){escribir("socket_bind() FALLA:\n\t".socket_strerror($ret));}else{escribir("socket_bind() OK");} if (($ret=socket_listen($master,SOMAXCONN))<0){escribir("socket_listen() FALLA:\n\t".socket_strerror($ret));}else{escribir("socket_listen() OK");} $read_sockets=array($master); //Empieza a escuchar los puertos while (true){ $changed_sockets=$read_sockets; $num_changed_sockets=socket_select($changed_sockets,$write=NULL,$except=NULL,NULL); foreach($changed_sockets as $socket){ if ($socket==$master){ if (($client=socket_accept($master))<0){ escribir("socket_accept() FALLA:\n\t".socket_strerror($msgsock)); continue; }else{ //Esto sucede cuando alguien entra al chat array_push($read_sockets,$client); escribir("Entro >>> $client"); //Se manda el mensaje de que alguien se conecta, pero se queda en el server hasta que alguien mande un mensaje en el chat. sendTotalMsg($allclients,"Administrador","$client entro a la sala\n"); } }else{ $bytes=socket_recv($socket,$buffer,2048,0); if ($bytes==0||trim($buffer)=="/salir"){ escribir("Salio >>> ".$socket); //Se manda el mensaje de que alguien se desconecta sendTotalMsg($allclients,"Administrador","$socket se desconecto\n"); $index=array_search($socket,$read_sockets); unset($read_sockets[$index]); socket_close($socket); }elseif(trim($buffer)=="/cerrar"){ die("server end"); }else{ $allclients=$read_sockets; array_shift($allclients); //Manda perfectamente un mensaje que introduzca algún usuario sendTotalMsg($allclients,$socket,$buffer); } } } } ?>
¿Cual es la direfencia de ejecutarlo donde yo lo pongo a donde venia en el script de la documentacion?
¿Como puedo mandar mensajes generados por el servidor?
¿Deben llevar algún parametro extra?
¿O acaso es algo que me falta?, no entiendo que es lo que sucede.
Muchas gracias por su atencion
