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()