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 — Получает данные из сокета независимо от состояния подключения сокета
$socket
,$length
,$flags
= 0,&$address
= null
Функция stream_socket_recvfrom() принимает
данные из удалённого сокета размером до length
байтов.
socket
Удалённый сокет.
length
Количество байт для получения из параметра socket
.
flags
Параметр flags
принимает произвольную комбинацию следующих флагов,
которые соединили двоичным оператором ИЛИ — |
.
STREAM_OOB |
Обрабатывать внеполосные OOB-данные (out-of-band ).
|
STREAM_PEEK |
Получать данные из сокета, но не расходовать буфер. Очередные вызовы функций fread() или stream_socket_recvfrom() получат те же самые данные. |
address
Функция заполнит параметр address
адресом удалённого сокета, если в списке аргументов для параметра передали переменную.
Функция возвращает прочитанные данные в виде строки или false
, если возникла ошибка.
Пример #1 Пример получения данных из сокет функцией stream_socket_recvfrom()
<?php
/* Открывает серверный сокет на порте 1234 хоста localhost */
$server = stream_socket_server('tcp://127.0.0.1:1234');
/* Принимает соединение */
$socket = stream_socket_accept($server);
/* Получает пакет (стандартный размер MTU 1500) OOB-данных */
echo "Функция получила OOB-данные (Out-Of-Band): '" . 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
. Отбросит ли функция байты, зависит от типа сокета, из которого она получила сообщение (например, UDP).
Замечание:
Вызовы функции stream_socket_recvfrom() на потоках на основе сокетов после вызовов функций наподобие fread() или stream_get_line(), которые работают с потоками на основе буферов, считывают данные непосредственно из сокета и пропускают буфер потока.
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()