socket_recv
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_recv — Получает данные из подсоединённого сокета
Описание
$socket
, string &$buf
, int $len
, int $flags
) : int
Функция socket_recv() получает
len
байт данных в буфер buf
из
сокета socket
. функция socket_recv() может
быть использована для получения данных из подсоединённых сокетов. Дополнительно к этому, один или
более флагов могут быть указаны для изменения поведения
функции.
Параметр buf
передаётся по ссылке, так что он должен быть
указан в виде переменной в списке аргументов. Данные, прочитанные из сокета
socket
функцией socket_recv(),
будут возвращены в параметре buf
.
Список параметров
-
socket
-
Параметр
socket
должен быть ресурсом сокета, предварительно созданным при помощи функции socket_create(). -
buf
-
Полученные данные будут переданы в переменную, указанную в параметре
buf
. Если происходит ошибка, если соединение сброшено, или если данные недоступны, параметрbuf
будет установлен вnull
. -
len
-
До
len
байт будет получено с удалённого хоста. -
flags
-
Значение параметра
flags
может быть любой комбинацией следующих флагов, соединённых при помощи двоичного оператора OR (|
).Possible values for flags
Флаг Описание MSG_OOB
Обрабатывать внеполосные (out-of-band) данные. MSG_PEEK
Получать данные с начала очереди получения без удаления их из очереди. MSG_WAITALL
Функция будет блокировать выполнение скрипта до тех пор, пока как минимум len
байт не будет получено. Однако, в том случае, если получен сигнал или удалённый хост отсоединился, функция может вернуть меньше данных.MSG_DONTWAIT
Если этот флаг установлен, то функция вернётся даже в том случае, если бы она обычно блокировала выполнение скрипта.
Возвращаемые значения
socket_recv() возвращает количество полученных байтов
или false
в случае ошибки. Фактический код ошибки может быть получен при помощи
функции socket_last_error(). Этот код ошибки может быть
передан функции socket_strerror() для получения текстового
описания ошибки.
Примеры
Пример #1 Пример использования socket_recv()
Этот пример - просто вариант первого примера из статьи Примеры с использованием socket_recv().
<?php
error_reporting(E_ALL);
echo "<h2>Соединение TCP/IP</h2>\n";
/* Получить порт сервиса WWW. */
$service_port = getservbyname('www', 'tcp');
/* Получить IP-адрес целевого хоста. */
$address = gethostbyname('www.example.com');
/* Создать сокет TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Не удалось выполнить функцию socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "OK.\n";
}
echo "Попытка соединиться с хостом '$address' по порту '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "Не получилось выполнить функцию socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}
$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';
echo "Отправка запроса HTTP HEAD...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
echo "Получение ответа:\n\n";
$buf = 'Это мой буфер.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo "Прочитано $bytes байта из функции socket_recv(). Закрываем сокет...";
} else {
echo "Не получилось выполнить socket_recv(); причина: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);
echo $buf . "\n";
echo "OK.\n\n";
?>
Пример выше выведет что-то вроде следующего:
<h2>Соединение TCP/IP</h2> OK. Попытка соединиться с хостом '208.77.188.166' on port '80'...OK. Отправка запроса HTTP HEAD...OK. Получение ответа: Прочитано 123 байта из функции socket_recv(). Закрываем сокет...HTTP/1.1 200 OK Date: Mon, 14 Sep 2009 08:56:36 GMT Server: Apache/2.2.3 (Red Hat) Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT ETag: "b80f4-1b6-80bfd280" Accept-Ranges: bytes Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8 OK.