note 115904 added to function.socket-recv

From: Date: Mon, 13 Oct 2014 02:17:53 +0000
Subject: note 115904 added to function.socket-recv
Groups: php.notes 
Request: Send a blank email to php-notes+get-200632@lists.php.net to get a copy of this message
socket_recv() returns FALSE if client returned no data returns 0 (zero) if client disconnected also (asuming case socket_select() "gave" us a "changed" socket): if socket_recv() returned FALSE and no bytes were received then client "crashed" (call it disconnected). else if socket_recv() returned 0 (zero) and no bytes were received then client "normaly" disconnected. Im pretty sure -- 99.99%. Example: <?php function receive($socket) { // ! // on all following cases we assume that // socket_select() returned the current socket as "changed" // ! $timeout = 3; // set your timeout /* important */ $socket_recv_return_values['no_data_received'] = false; $socket_recv_return_values['client_disconnected'] = 0; $start = time(); $received_data = null; $received_bytes = null; socket_set_nonblock($socket); socket_clear_error(); while( ($t_out=((time()-$start) >= $timeout)) === false and ($read=@socket_recv($socket, $buf, 4096, 0)) >= 1 ){ $received_data = (isset($received_data)) ? $received_data . $buf : $buf; $received_bytes = (isset($received_bytes)) ? $received_bytes + $read : $read; } $last_error = socket_last_error($socket); socket_set_block($socket); if($t_out === true){ throw new Exception( 'timeout after ' . ((!$received_bytes) ? 0 : $received_bytes) . ' bytes', 0 // your eCode here ); } elseif($last_error !== false and $last_error !== 0){ throw new Exception( socket_strerror($last_error), $last_error ); } else{ if($read === $socket_recv_return_values['no_data_received']){ // client returned NO DATA // but we were in a loop and could have got some data before: if($received_bytes < 1){ // client is connected but sent NO DATA ? // no: // in this case the client must be "crashed" because - // it is not possible to "send no data" (zero bytes) // socket_select() now returns this socket as "changed" "forever" throw new Exception( 'client crashed', 0 // your eCode here ); }else{ // client returned DATA return $received_data; } } elseif($read === $socket_recv_return_values['client_disconnected']){ // client disconnected if($received_bytes < 1){ // client disconnected before/without sending any bytes throw new Exception( 'client disconnected', 0 // your eCode here ); } else{ // *this value* ^= $socket_recv_return_values['client_disconnected'] // // client disconnected AFTER sending data (we were in a loop!) // socket_select() will return this socket "forever" as "changed" and - // socket_recv() will return *this value* "forever". // we will be "back" again "very soon" to see: // socket_recv() returns *this value* AND no bytes received // which results in disconnect-exception above return $received_data; } } } } ?> ---- Server IP: 212.124.37.9 Probable Submitter: 146.52.85.150 ---- Manual Page -- http://php.net/manual/en/function.socket-recv.php Edit -- https://master.php.net/note/edit/115904 Del: integrated -- https://master.php.net/note/delete/115904/integrated Del: useless -- https://master.php.net/note/delete/115904/useless Del: bad code -- https://master.php.net/note/delete/115904/bad+code Del: spam -- https://master.php.net/note/delete/115904/spam Del: non-english -- https://master.php.net/note/delete/115904/non-english Del: in docs -- https://master.php.net/note/delete/115904/in+docs Del: other reasons-- https://master.php.net/note/delete/115904 Reject -- https://master.php.net/note/reject/115904 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#200632) next »