2012-03-31 13 views
8

He estado trabajando últimamente en la construcción de un servidor TCP usando PHP (sé por error la opción para empezar, pero este es el estándar de trabajo), así que he llegado al punto donde hay un prototipo confiable para hacer pruebas y mostró Buenos resultados. al principio utilicé las funciones de socket para manejar a la conexión para el servidor y funcionaba bien, pero una de las cosas principales del proyecto es asegurar el canal, así que cambié a stream_socket.¿Cómo saber si la conexión se restablece por pares en php?

Lo que quiero es un equivalente de socket_last_error en el grupo de stream_socket para saber cuándo la conexión con el cliente está cerrada o no. En la situación actual, todos los procesos esperarán hasta que el temporizador de tiempo de espera se libere aunque el cliente ya esté cerrado.

He buscado en la red y he descubierto que no hay forma de averiguarlo a través de PHP y he descubierto que algunas personas abrieron un ticket de problema al solicitar el equivalente de socket_last_error para la transmisión. https://bugs.php.net/bug.php?id=34380

¿Hay alguna forma de saber cuándo se produce la señal FIN_WAIT o no?

Gracias,

Respuesta

1

no creo que es posible que la familia stream_socket, parece que es demasiado elevada.

Traté de hacer una solución muy hacker, no sé si va a trabajar para usted, no es muy fiable:

<?php 
set_error_handler('my_error_handler'); 

function my_error_handler($no,$str,$file,$line) { 
    throw new ErrorException($str,$no,0,$file,$line); 
} 

$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr); 
if (!$socket) { 
    echo "$errstr ($errno)\n"; 
} else { 
    while ($conn = stream_socket_accept($socket)) { 
    foreach (str_split('The local time is ' . date('n/j/Y g:i a') . "\n") as $char) { 
     echo $char; 
     try { 
      fwrite($conn,$char); 
     } catch (ErrorException $e) { 
      if (preg_match("/^fwrite\(\): send of 1 bytes failed with errno=([0-9]+) ([A-Za-z \/]+)$/",$e->getMessage(), $matches)) { 
        list($errno,$errstr) = array((int) $matches[1], $matches[2]); 
        if ($errno === 32) { 
          echo "\n[ERROR] $errstr"; // Broken pipe 
        } 
      } 
      echo "\n[ERROR] Couldn't write more on $conn"; 
      break; 
     } 
     fflush($conn); 
    } 
    fclose($conn); 
    } 
    fclose($socket); 
} 
echo "\n"; 
?> 

Lanzamiento: php ./server.php

conexion: nc localhost 8000 | head -c1

Salida del servidor:

The loca 
[ERROR] Broken pipe 
[ERROR] Couldn't write more on Resource id #6 
+0

Gracias Janus por la respuesta pero. como usted sabe, no es factible hacer ruido en la transmisión al enviar datos para ver cuando se rompe o no, la situación actual es que el servidor espera las acciones del cliente, ¿por lo que con lo que sugirió no creo que sea factible? – user1304594

Cuestiones relacionadas