note 117607 added to function.stream-socket-recvfrom
| From: | raat1979 at gmail dot com | Date: | Tue, 07 Jul 2015 08:31:01 +0000 |
| Subject: | note 117607 added to function.stream-socket-recvfrom | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-203055@lists.php.net to get a copy of this message | ||
Basically there is currently no real way to determine what the position of the Out of band data is
in the tcp/ip stream.
However, it seems that In my current environment (winsock: Windows / PHP 5.3.0) you do not peek
beyond the OOB byte unless the buffer is empty
reads do read beyond the OOB data. (I'll check my linux box later)
You should be able to figure out the position of the OOB data by peeking and reading from the
regular stream
although it would not be 100% reliable as we do read beyond the OOB data when nothing is in front of
it.
depending on the high level protocol it might be possible
to handle the specific "no data in front of out-of-band data" case
<?php
echo "<pre>";
$sockets = stream_socket_pair(STREAM_PF_INET, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$reader=$sockets[0];
$writer=$sockets[1];
stream_socket_sendto($writer,"abc");
stream_socket_sendto($writer,"xyZ",STREAM_OOB); // ONLY THE LAST BYTE IS MARKED AS OOB
DATA
stream_socket_sendto($writer,"def");
echo "\r\n";
echo "Test 1, Peeking beyond oob when the read buffer becomes empty\r\n";
echo "The data order is 'abcxyZdef'\r\n";
stream_select($r=array($reader), $w=array(), $x=array($reader),5);
echo "has regular:";var_dump(count($r)!==0);
echo "has oobData:";var_dump(count($x)!==0);
echo "<span style='color:blue' >Peek (9)
regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "<span style='color:green'>Peek (1)
OobData:".stream_socket_recvfrom($reader,9,STREAM_OOB|STREAM_PEEK)."</span>\r\n";
echo "<span style='color:black'>READ (4)
regular:".stream_socket_recvfrom($reader,4)."</span>\r\n";
echo "<span style='color:blue' >Peek (9)
regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "<span style='color:black'>READ (1)
regular:".stream_socket_recvfrom($reader,1)."</span>\r\n";
echo "<span style='color:blue' >Peek (9)
regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
// read the OOB data
echo "<span style='color:red' >READ (9)
OobData:".stream_socket_recvfrom($reader,9,STREAM_OOB)."</span>\r\n";
echo "<span style='color:blue' >Peek (9)
regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
fclose($sockets[0]);
fclose($sockets[1]);
echo "</pre>";
?>
outputs:
Test 1, Peeking beyond oob when the read buffer becomes empty
The data order is 'abcxyZdef'
has regular:bool(true)
has oobData:bool(true)
Peek (9) regular:abcxy
Peek (1) OobData:Z
READ (4) regular:abcx
Peek (9) regular:y
READ (1) regular:y
Peek (9) regular:def
READ (9) OobData:Z
Peek (9) regular:def
<?php
echo "<pre>";
$sockets = stream_socket_pair(STREAM_PF_INET, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$reader=$sockets[0];
$writer=$sockets[1];
stream_socket_sendto($writer,"Z",STREAM_OOB); // ONLY THE LAST BYTE IS MARKED AS OOB DATA
stream_socket_sendto($writer,"abcxydef");
echo "<hr/>";
echo "\r\n";
echo "Test 2, peek if there is nothing in front of the OOB data\r\n";
echo "The data order is 'Zabcxydef'\r\n";
stream_select($r=array($reader), $w=array(), $x=array($reader),5);
echo "has regular:";var_dump(count($r)!==0);
echo "has oobData:";var_dump(count($x)!==0);
echo "<span style='color:blue'>peek (9)
regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "<span style='color:red' >Peek (9)
OobData:".stream_socket_recvfrom($reader,9,STREAM_OOB)."</span>\r\n";
echo "<span style='color:blue'>peek (9)
regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "</pre>";
?>
Outputs:
Test 2, peek if there is nothing in front of the OOB data
The data order is 'Zabcxydef'
has regular:bool(true)
has oobData:bool(true)
peek (9) regular:abcxydef
Peek (9) OobData:Z
peek (9) regular:abcxydef
----
Server IP: 72.52.91.14
Probable Submitter: 89.20.95.34
----
Manual Page -- http://php.net/manual/en/function.stream-socket-recvfrom.php
Edit -- https://master.php.net/note/edit/117607
Del: integrated -- https://master.php.net/note/delete/117607/integrated
Del: useless -- https://master.php.net/note/delete/117607/useless
Del: bad code -- https://master.php.net/note/delete/117607/bad+code
Del: spam -- https://master.php.net/note/delete/117607/spam
Del: non-english -- https://master.php.net/note/delete/117607/non-english
Del: in docs -- https://master.php.net/note/delete/117607/in+docs
Del: other reasons-- https://master.php.net/note/delete/117607
Reject -- https://master.php.net/note/reject/117607
Search -- https://master.php.net/manage/user-notes.php