Note that stream_socket_recvfrom() bypasses stream wrappers including TLS/SSL. While reading from an encrypted stream with fread() will return decrypted data, using stream_socket_recvfrom() will give you the original encrypted bytes.
(PHP 5, PHP 7, PHP 8)
stream_socket_recvfrom — Bağlı olsun ya da olmasın bir soketten veri alır
$soket
,$uzunluk
,$seçenekler
= 0,&$adres
= null
stream_socket_recvfrom() işlevi uzak bir soketten
uzunluk
baytlık veri alır.
soket
Uzak soket.
uzunluk
soket
'tan alınacak bayt sayısı.
seçenekler
seçenekler
şunların bir birleşimi olarak
belirtilebilir:
STREAM_OOB |
Band dışı veri alınır. |
STREAM_PEEK |
Veri soketten alınır fakat tampon okunmamış bırakılır. Sonraki fread() veya stream_socket_recvfrom() çağrıları aynı veriyi görür. |
adres
Belirtildiği takdirde uzak soketin adresi olarak ele alınır.
Başarı durumunda okunan veri dizge olarak, başarısızlık durumunda false
döner.
Örnek 1 - stream_socket_recvfrom() örneği
<?php
/* localhost üzerinde 1234 portuna bir sunucu soketi açalım */
$server = stream_socket_server('tcp://127.0.0.1:1234');
/* Bir bağlantı kabul edelim */
$socket = stream_socket_accept($server);
/* Band dışı veri olarak bir paket yakalayalım (MTU boyutu 1500 olsun) */
echo "Alınan band dışı veri: '" .
stream_socket_recvfrom($socket, 1500, STREAM_OOB) . "'\n";
/* Normal band dışı veriye bir göz atalım ama okunmamış bırakalım */
echo "Veri: '" . stream_socket_recvfrom($socket, 1500, STREAM_PEEK) . "'\n";
/* Aynı paketi tekrar alalım ama bu sefer tampondan silelim */
echo "Veri: '" . stream_socket_recvfrom($socket, 1500) . "'\n";
/* Portu kapatalım */
fclose($socket);
fclose($server);
?>
Bilginize:
uzunluk
bayttan daha uzun bir veri alınırsa, verinin alındığı soketin türüne bağlı olarak (UDP gibi) fazla baytlar iptal edilebilir.
Bilginize:
Sokete dayalı akımlar üzerindeki stream_socket_recvfrom() çağrıları, tamponlu akım işlevlerinden (fread() veya stream_get_line() gibi) sonra, veriyi soketten akım tamponunu devreden çıkararak doğrudan doğruya okur.
Note that stream_socket_recvfrom() bypasses stream wrappers including TLS/SSL. While reading from an encrypted stream with fread() will return decrypted data, using stream_socket_recvfrom() will give you the original encrypted bytes.
This method may return a peer address not compatible with stream_socket_sendto() if in ipv6.
The ip returned by recvfrom is not within brackets ([]), and has the port appended, which makes it look like ::1:1234. To cut it properly, use strrpos()
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