PHP Conference Nagoya 2025

socket_recvfrom

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_recvfromПолучает данные из сокета, независимо от того, подсоединён он или нет

Описание

socket_recvfrom(
    Socket $socket,
    string &$data,
    int $length,
    int $flags,
    string &$address,
    int &$port = null
): int|false

Функция socket_recvfrom() получает length байт данных в data из адреса address на порту port (если сокет не типа AF_UNIX) используя сокет socket. Функция socket_recvfrom() может быть использована для извлечения данных как из подключённых, так и из не подключённых сокетов. Дополнительно, один или более флагов могут быть указаны для того, чтобы изменить поведение функции.

Параметры address и port должны быть переданы по ссылке. Если сокет не ориентирован на соединение, address должен быть установлен как адрес интернет-протокола удалённого хоста, либо как путь к сокету UNIX. Если сокет не ориентирован на соединение, address должен быть null. Дополнительно, port должен содержать порт удалённого хоста для не подключённых сокетов типа AF_INET и AF_INET6.

Замечание: Функция безопасна для обработки данных в двоичной форме.

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

socket

Параметр socket должен быть экземпляром Socket, предварительно созданным при помощи функции socket_create().

data

Полученные данные будут переданы в переменную, указанную при помощи параметра data.

length

С удалённого хоста будет получено до length байт.

flags

Значение параметра flags может быть любой комбинацией следующих флагов, объединённых при помощи двоичного оператора OR (|) operator.

Возможные значения для параметра flags
Флаг Описание
MSG_OOB Обрабатывать внеполосные (out-of-band) данные.
MSG_PEEK Получать данные из начала очереди, не удаляя их.
MSG_WAITALL Блокировать выполнение скрипта до тех пор, пока как минимум length не будет получено. Однако, если будет получен сигнал или удалённый хост отсоединится, функция может возвратить меньше данных.
MSG_DONTWAIT Если этот флаг установлен, функция возвратится даже если обычно она будет блокировать выполнение скрипта.
address

Если сокет типа AF_UNIX, address - это путь к файлу. В ином случае, для неподсоединённых сокетов, параметр address - это IP-адрес, удалённого хоста, или null, если сокет ориентирован по соединение.

port

Этот аргумент применим только к сокетам AF_INET и AF_INET6, и указывает удалённый порт, из которого будут получены данные. Если сокет ориентирован по соединение, port будет null.

Возвращаемые значения

socket_recvfrom() возвращает количество полученных байт или false, если произошла ошибка. Фактический код ошибки может быть получен при помощи вызова функции socket_last_error(). Этот код ошибки может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия Описание
8.0.0 Теперь параметр socket ожидает экземпляр класса Socket; раньше параметр ожидал ресурс (resource).

Примеры

Пример #1 Пример использования socket_recvfrom()

<?php

$socket
= socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 1223);

$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 12, 0, $from, $port);

echo
"Получено $buf с удалённого адреса $from и удалённого порта $port" . PHP_EOL;
?>

Этот пример откроет UDP-сокет на порту 1223 по адресу 127.0.0.1 и выведет максимум 12 символов, полученных с удалённого хоста.

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

  • socket_recv() - Получает данные из подключённого сокета
  • socket_send() - Отправляет данные в подсоединённый сокет
  • socket_sendto() - Отправляет сообщение в сокет независимо от состояния подключения сокета
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)

Добавить

Примечания пользователей 4 notes

up
3
lorin dot weilenmann at gmail dot com
9 years ago
If you use socket_recvfrom on a UDP socket and combine it with the MSG_DONTWAIT flag, it will raise a PHP Warning if there is nothing to read. AFAIK, there is no way around that warning except suppressing it with @ (i.e. you cannot check if there is data before calling socket_recvfrom).
up
2
ply2attoetensen-project.com
7 years ago
MSG_DONTWAIT doesn't seem to exist in windows sockets. However socket_set_nonblock() seems to do the trick.
up
1
davide dot renzi at gmail dot com
12 years ago
Pay attention! On some PHP version the MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)
up
-3
jaggerwang at gmail dot com
17 years ago
I'm confused about the rerturn value of socket_recvfrom(), it said -1 when failed, but when I call like this:

if (($len = @socket_recvfrom($sock, $result, 32, 0, $ip, $port)) == -1) {
if ($this->_debug) {
echo "socket_read() failed: " . socket_strerror(socket_last_error()) . "\n";
}
return false;
}

variable $len = false, when I change the buffer length from 32 to 4096, it becomes right.
To Top