2012-03-31 3 views
8

Ho lavorato ultimamente a costruire un server TCP usando PHP (conosco la scelta sbagliata per iniziare, ma questo è lo standard di lavoro), quindi ho raggiunto un punto in cui esiste un prototipo affidabile per eseguire test su di esso e ha dimostrato buoni risultati. all'inizio ho usato le funzioni socket per gestire la connessione per il server e funzionava bene, ma una delle cose principali del progetto è rendere il canale protetto, quindi sono passato a stream_socket.Come sapere quando la connessione viene ripristinata da peer in php?

quello che voglio è un equivalente socket_last_error nel gruppo stream_socket, quindi posso sapere ogni volta che la connessione con il client è chiusa o meno. la situazione attuale prevede che tutti i processi attenderanno il timeout per il rilascio anche se il client è già chiuso.

Ho cercato la rete e ho scoperto che non c'è modo di capirlo tramite PHP e ho scoperto che alcune persone hanno aperto un ticket di questo tipo chiedendo l'equivalente di socket_last_error per lo streaming. https://bugs.php.net/bug.php?id=34380

quindi c'è ancora da sapere quando viene rilevato il segnale FIN_WAIT?

Grazie,

risposta

1

non credo che sia possibile la famiglia stream_socket, sembra che sia troppo elevato.

Ho provato a fare una soluzione molto hackish, non so se funzionerà per voi, non è molto affidabile:

<?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"; 
?> 

lancio: php ./server.php

Connect: nc localhost 8000 | head -c1

Server output:

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

Grazie Janus per la risposta ma. come sapete non è fattibile rumoreggiare il flusso inviando alcuni dati per vedere ogni volta che è rotto o no anche la situazione attuale è che il server attende azioni client quindi con quello che hai suggerito non credo sia fattibile? – user1304594