Bug #79222 [Opn]: unread_bytes do not work
| From: | nikic@php.net | Date: | Tue, 04 Feb 2020 13:39:01 +0000 |
| Subject: | Bug #79222 [Opn]: unread_bytes do not work | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-225353@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=79222&edit=1
ID: 79222
Updated by: nikic@php.net
Reported by: skullnobrains at gmail dot com
Summary: unread_bytes do not work
Status: Open
Type: Bug
Package: Sockets related
Operating System: linux
PHP Version: 7.2.27
Block user comment: N
Private report: N
New Comment:
unread_bytes is the number of bytes stored in PHP's internal read buffer. It does not indicate
whether data is available to read or not. That's what stream_select() is for.
The documentation has this peculiar note for this value:
> Note: You shouldn't use this value in a script.
Previous Comments:
------------------------------------------------------------------------
[2020-02-04 13:13:06] skullnobrains at gmail dot com
Description:
------------
i am directly connecting to a mysql server using stream socket functions.
when there is something to read, stream_get_meta_data() reports 0 bytes to read, and 255 when there
is nothing to read.
i tried multiple 7.x versions and ended up with similar results : 7.2.7 , 7.3 , and a few others
Test script:
---------------
function my_msg_r($sock){
echo "===== READ =====\n";
var_dump(stream_get_meta_data($sock)['unread_bytes']);
$header=stream_socket_recvfrom($sock, 4, STREAM_PEEK);
my_od($header);
if(4!==strlen($header))
return my_wrn("failed to read a complete packet header");
$len=my_str2int(substr($header,0,3));
if($len===0xffffff)return my_wrn("i do not handle packets longer than 2pow24 yet,
sorry");
printf("READ LEN %s 0x%x\n",$len,$len);
printf("READ SEQ %u\n",ord($header[3]));
/* TODO CHECK THE SEQUENCE NUMBER : THE CALLER SHOULD PASS THE EXPECTED SEQ NUMBER AND WRITE AN OUT
OF ORDER ERROR IF SOMETHING GOES WRONG */
/* TODO CHECK WE HAVE ENOUGH UNREAD BYTES OR AT LEAST WHAT LENGTH WE MANAGED TO READ */
//if($n===0xffffff)return fread($sock,$n).my_msg_r($sock); # TODO proper error handling + this is
not compatible with async operations
return substr(fread($sock,$len+4),4); # TODO proper error handling !
}
/* i am not including my_od which merely produces the lines starting with od : one line per
character with the increment, decimal ascii code, ascii character, and hex value and have no
relation with the bug. this looks like an old 5.6 bug i stumbled upon many years ago and was fixed
*/
Actual result:
--------------
===== READ =====
int(0)
od 0 7 111
od 1 0 0
od 2 0 0
od 3 2 10
READ LEN 7 0x7
READ SEQ 2
CONNECTED AND AUTHENTICATED : Resource id #2
===== WRITE =====
od 0 15 1111
od 1 0 0
od 2 0 0
od 3 0 0
WRITE LEN=15
WRITE SEQ=0
===== READ =====
int(0)
od 0 1 1
od 1 0 0
od 2 0 0
od 3 1 1
READ LEN 1 0x1
READ SEQ 1
field count=1
===== READ =====
int(255)
... a this point, i hit ctrl+c because there is and won't be anything to read
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=79222&edit=1