note 117607 added to function.stream-socket-recvfrom

From: 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

« previous php.notes (#203055) next »