Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Seriale da socket PHP

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    residenza
    Brescia
    Messaggi
    81

    Seriale da socket PHP

    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_INETSOCK_STREAM0)))  {
        
    $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_socks1024);
    $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_socksencode(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 + ($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'$b126$len) . $text;
     } else {
      return 
    pack('CCNN'$b1270$len) . $text;
     }
    }
    ?>
    Ultima modifica di autsel; 29-06-2016 a 14:40

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2002
    residenza
    Brescia
    Messaggi
    81
    Ultimo aggiornamento.....
    Per ora ho risolto così:
    Oltre a questo socket ne ho un altro che viene avviato contemporaneamente e lavora in modo bidirezionale.
    (I socket lavorano sempre insieme).
    Quando rilevo la disconnessione con il secondo socket, prima di chiuderlo chiamo un file .sh che brutalmente mi killa il primo (quello con la seriale per intenderci).... poi daemontools pensa a farli ripartire entrambi in attesa di una nuova connessione.

    Se qualcuno ha qualche idea più intelligente lieto di leggerla.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.