On Thu, Mar 12, 2009 at 11:19:28AM -0200, Diego Woitasen wrote:
> On Wed, Mar 11, 2009 at 07:19:46PM -0300, Jorge Giunta wrote:
> > Diego Woitasen wrote:
> >> On Wed, Mar 11, 2009 at 09:38:53AM -0300, Jorge Giunta wrote:
> >>
> >>> Muchachos este es un server multithreat en php, pero necesito enviar
> >>> un mensaje de bienvenida apenas se conecte uno de los clientes, pero
> >>> no consigo hacerlo, podria alguien darme una mano ? Aca esta el
> >>> codigo.
> >>>
> >>>
> >>>> #!/usr/bin/php
> >>>> <?php
> >>>>
> >>>> $hostname = gethostbyname("localhost");
> >>>> $address = '0.0.0.0';
> >>>> $port = 12345;
> >>>>
> >>>> set_time_limit(0);
> >>>> ob_implicit_flush();
> >>>> ignore_user_abort(true);
> >>>> function socketError($errorFunction, $die=false) {
> >>>> $errMsg = socket_strerror(socket_last_error());
> >>>> }
> >>>> if (!($server = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
> >>>> socketError('socket_create', true);
> >>>> }
> >>>> socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
> >>>> if (!...@socket_bind($server, $address, $port)) {
> >>>> socketError('socket_bind', true);
> >>>> }
> >>>> if (!...@socket_listen($server)) {
> >>>> socketError('socket_listen', true);
> >>>> }
> >>>> $allSockets = array($server);
> >>>> while (true) {
> >>>> echo ' ';
> >>>> if (connection_aborted()) {
> >>>> foreach ($allSockets as $socket) {
> >>>> socket_close($socket);
> >>>> }
> >>>> break;
> >>>> }
> >>>> $changedSockets = $allSockets;
> >>>> socket_select($changedSockets, $write = NULL, $except = NULL, 5);
> >>>>
> >>>> foreach($changedSockets as $socket) {
> >>>> if ($socket == $server) {
> >>>> if (!($client = @socket_accept($server))) {
> >>>> socketError('socket_accept', false);
> >>>> } else {
> >>>> $allSockets[] = $client;
> >>>> }
> >>>> } else {
> >>>> $data = socket_read($socket, 2048);
> >>>> //
> >>>> socket_write($socket,"BIENVENIDO",strlen("BIENVENIDO")); ESTO
> >>>> PROBE PONIENDOLO ARRIBA Y ABAJO Y EN TODOS LADOS Y NADA.
> >>>> }
> >>>>
> >>>> if ($data === false || $data === '') {
> >>>> unset($allSockets[array_search($socket,
> >>>> $allSockets)]);
> >>>> socket_close($socket);
> >>>> } else {
> >>>> echo "$socket: $data\n";
> >>>> }
> >>>> }
> >>>> }
> >>>> }
> >>>> ?>
> >>>>
> >>> Muchas gracias gente !!!! saludos
> >>>
> >>> --
> >>> Jorge
> >>>
> >>
> >> Un comentario, no es multithread, es event-driven ese código :)
> >>
> >> Además, no me imagino multithread en PHP.
> >>
> >> Por cierto, copia el código y funciona sin problemas. Solo sobraba una
> >> llave al final.
> >>
> >> saludos!
> >>
> >>
> >> PD: lo probé con un telnet, no se como lo estarás probando vos pero tal
> >> vez estes leyendo con alguna función que lee por líneas del lado cliente y
> >> ese sea tu problema. Agregale un '\n\r' a BIENVENIDO.
> >>
> >>
> > Pero con telnet, tenes que darle enter para que muestre el mensaje de
> > bienvenida !! sino no muestra nada apenas conectas !!
> >
> > --
> > Jorge
>
> Entonces poné el socket_write() antes del socket_read() y listo...
>
> --
>
> --------------
> Diego Woitasen
Me corrijo, hace el write después del accept(). El write() funciona cuando
tocas enter por que se tiene que disparar un evento de lectura para que el
select lo detecte y se ejecute esa líneas de código.
--
--------------
Diego Woitasen