PHP 8.4.0 RC2 available for testing

stream_socket_recvfrom

(PHP 5, PHP 7, PHP 8)

stream_socket_recvfromПолучает данные из сокета независимо от состояния подключения сокета

Описание

stream_socket_recvfrom(
    resource $socket,
    int $length,
    int $flags = 0,
    ?string &$address = null
): string|false

Функция stream_socket_recvfrom() принимает данные из удалённого сокета размером до length байтов.

Список параметров

socket

Удалённый сокет.

length

Количество байт для получения из параметра socket.

flags

Параметр 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(), которые работают с потоками на основе буферов, считывают данные непосредственно из сокета и пропускают буфер потока.

Смотрите также

  • stream_socket_sendto() - Отправляет сообщение в сокет, независимо от состояния подключения сокета
  • stream_socket_client() - Открывает соединение с интернет-сокетом или с доменным Unix-сокетом
  • stream_socket_server() - Создаёт серверный сокет Internet- или Unix-домена
add a note

User Contributed Notes 2 notes

up
23
cweiske at php dot net
14 years ago
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.
up
6
MagicalTux at php dot net
13 years ago
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()
To Top