Ciao ragazzi ho un problemino..... ho creato un socket php per la lettura di dati da seriale e funziona tutto a meraviglia. Ho anche impostato il server socket come servizio e nel caso venga chiuso viene riavviato automaticamente.
Il flusso rimane "bloccato" ovviamente fino alla ricezione di dati sulla seriale e questo mi sta bene.
La mia domanda è :
Se l'utente mi chiude per esempio il browser.... come faccio a rilevare la disconnessione così da poter chiudere il socket se il flusso mi rimane bloccato ?
Qualcuno mi sa aiutare ?
Grazie in anticipo....
Codice PHP:
<?php
require_once "../config.php";
error_reporting(~E_NOTICE);
set_time_limit (0);
$address = $server_addr;
$port = $socket_port2;
$max_clients = $socket_max_client;
$socket_info=1;
//Apertura 485
system("stty -F $rs485_device $rs485_options");
//system("stty -F $rs485_device -echo -echoe -echok");
system($set_gpio_as_output);
$fp=fopen($rs485_device,'r');
system("gpio write 1 0"); //RS485 IN LETTURA
//DEBUG system($rs485_out); fwrite($fp, " " ); system($rs485_in);
// *********************************************************************************** create socket
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
if($socket_info) echo "Socket created \n";
// *********************************************************************************** Bind the source address
if( !socket_bind($sock, $address , $port) ) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
if($socket_info) echo "Socket bind OK \n";
// *********************************************************************************** Listen
if(!socket_listen ($sock , 10)) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
if($socket_info) echo "Socket listen OK \n";
if($socket_info) echo "Waiting for incoming connections... \n";
// *********************************************************************************** Socket accept
$client_socks = socket_accept($sock);
if($socket_info) {
if(socket_getpeername($client_socks, $address, $port)) {
echo "Client $address : $port is now connected to us. \n\n";
}
}
//read connection header
$x=socket_read($client_socks, 1024);
$request=explode(chr(10),$x);
for($i=0; $i<(sizeof($request)); $i++) {
if($socket_info) echo "$i:->".$request[$i]."\n";
$requestExplode=explode(":",$request[$i]);
if($requestExplode[0]=="Sec-WebSocket-Key") {
$requestKey=trim($requestExplode[1]);
$responseKey=base64_encode(sha1($requestKey."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",1));
if($socket_info) echo "----------------------------------->$requestKey\n";
if($socket_info) echo "----------------------------------->$responseKey\n";
}
}
// *********************************************************************************** Connetion accepted ... Send Welcome message to client
$message = "HTTP/1.1 101 Switching Protocols\r\n";
$message .= "Upgrade: Websocket\r\n";
$message .= "Connection: Upgrade\r\n";
$message .= "Sec-WebSocket-Accept: ".$responseKey."\r\n\r\n";
if($socket_info) echo $message,"\r\n";
socket_write($client_socks , $message);
while(1) {
$char=fgetc($fp);
//echo $char;
socket_write($client_socks, encode(ord($char)));
}
function decode($frame) {
$len = ord($frame[1]) & 127;
if ($len === 126) {
$ofs = 8;
} elseif ($len === 127) {
$ofs = 14;
} else {
$ofs = 6;
}
$text = '';
for ($i = $ofs; $i < strlen($frame); $i++) {
$text .= $frame[$i] ^ $frame[$ofs - 4 + ($i - $ofs) % 4];
}
return $text;
}
function encode($text) {
$b = 129; // FIN + text frame
$len = strlen($text);
if ($len < 126) {
return pack('CC', $b, $len) . $text;
} elseif ($len < 65536) {
return pack('CCn', $b, 126, $len) . $text;
} else {
return pack('CCNN', $b, 127, 0, $len) . $text;
}
}
?>