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


(PHP 4 >= 4.1.0, PHP 5)

socket_recvПолучает данные из подсоединённого сокета

Описание

int socket_recv ( resource $socket , string &$buf , int $len , int $flags )

Функция 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_INETSOCK_STREAMSOL_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$instrlen($in));
echo 
"OK.\n";

echo 
"Получение ответа:\n\n";
$buf 'Это мой буфер.';
if (
false !== ($bytes socket_recv($socket$buf2048MSG_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 Connection</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.