請注意,`stream_socket_recvfrom()` 會繞過串流包裝器,包括 TLS/SSL。雖然使用 `fread()` 從加密的串流讀取會返回解密後的資料,但使用 `stream_socket_recvfrom()` 會得到原始的加密位元組。
(PHP 5, PHP 7, PHP 8)
stream_socket_recvfrom — 從已連線或未連線的通訊端接收資料
stream_socket_recvfrom() 從遠端通訊端接收最多 length
位元組的資料。
socket
遠端通訊端。
length
從 socket
接收的位元組數。
flags
flags
的值可以是以下任意組合
STREAM_OOB |
處理 OOB(帶外 )數據。 |
STREAM_PEEK |
從 socket 檢索數據,但不消耗緩衝區。後續對 fread() 或 stream_socket_recvfrom() 的調用將會看到相同的數據。 |
address
如果提供了 address
,它將會被填入遠端 socket 的位址。
返回讀取的數據,以字串形式返回,失敗時返回 false
。
範例 #1 stream_socket_recvfrom() 範例
<?php
/* 在本地主機上開啟一個連接埠為 1234 的伺服器 socket */
$server = stream_socket_server('tcp://127.0.0.1:1234');
/* 接受連線 */
$socket = stream_socket_accept($server);
/* 取得一個 OOB 數據封包(1500 是典型的 MTU 大小) */
echo "收到帶外數據: '" . stream_socket_recvfrom($socket, 1500, STREAM_OOB) . "'\n";
/* 預覽正常的帶內數據,但不消耗它。 */
echo "數據: '" . stream_socket_recvfrom($socket, 1500, STREAM_PEEK) . "'\n";
/* 再次取得完全相同的封包,但這次將其從緩衝區中移除。 */
echo "數據: '" . stream_socket_recvfrom($socket, 1500) . "'\n";
/* 關閉它 */
fclose($socket);
fclose($server);
?>
注意:
如果接收到的訊息長度超過
length
參數,則可能會根據接收訊息的 socket 類型(例如 UDP)捨棄多餘的位元組。
注意:
在基於緩衝區的串流函數(例如 fread() 或 stream_get_line())調用之後,對基於 socket 的串流調用 stream_socket_recvfrom() 會直接從 socket 讀取數據,並繞過串流緩衝區。
請注意,`stream_socket_recvfrom()` 會繞過串流包裝器,包括 TLS/SSL。雖然使用 `fread()` 從加密的串流讀取會返回解密後的資料,但使用 `stream_socket_recvfrom()` 會得到原始的加密位元組。
如果在 ipv6 中,此方法可能會返回與 `stream_socket_sendto()` 不相容的對端位址。
`recvfrom` 返回的 IP 並未包含在括號 ([]) 中,並且附加了埠號,使其看起來像 ::1:1234。要正確切割它,請使用 `strrpos()`。