note 115904 added to function.socket-recv
| From: | cottton at i-stats dot net | 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