socket_recv

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

socket_recvRecibe datos de un socket conectado

Descripción

socket_recv(
    Socket $socket,
    ?string &$data,
    int $length,
    int $flags
): int|false

La función socket_recv() recibe length bytes de datos en data desde socket. socket_recv() puede ser utilizada para recuperar datos desde sockets conectados. Asimismo, los flags permiten modificar el comportamiento de la función.

data se pasa por referencia, por lo que debe estar presente en la lista de argumentos. Los datos recibidos desde la socket por socket_recv() serán devueltos en data.

Parámetros

socket

socket debe ser una instancia de Socket previamente creada por socket_create().

data

Los datos recibidos serán transmitidos en data. Si ocurre un error, si la conexión está cerrada o si no hay datos disponibles, data valdrá entonces null.

length

Hasta length bytes serán leídos desde el host remoto.

flags

El valor de flags puede ser una combinación de los siguientes flags, agrupados mediante el operador OR binario (|).

Valores posibles de flags
Flag Descripción
MSG_OOB Trata datos fuera de banda.
MSG_PEEK Recibe los datos desde el inicio de la cola sin eliminarlos de la cola.
MSG_WAITALL Bloquea antes de que al menos length bytes sean recibidos. Sin embargo, si se intercepta una señal o la conexión se termina, la función puede devolver menos datos.
MSG_DONTWAIT Si este flag está especificado, la función devolverá datos cuando normalmente habría bloqueado.

Valores devueltos

socket_recv() devuelve el número de bytes recibidos, o false si ha ocurrido un error. El código de error actual puede ser recuperado llamando a socket_last_error(). Este código de error puede ser pasado a la función socket_strerror() para obtener una representación textual del error.

Historial de cambios

Versión Descripción
8.0.0 socket is a Socket instance now; previously, it was a resource.

Ejemplos

Ejemplo #1 Ejemplos con socket_recv()

Este ejemplo es una reescritura del ejemplo tomado en Ejemplos para utilizar socket_recv().

<?php
error_reporting
(E_ALL);

echo
"<h2>Conexión TCP/IP</h2>\n";

/* Obtiene el puerto del servicio WWW. */
$service_port = getservbyname('www', 'tcp');

/* Obtiene la dirección IP del host objetivo. */
$address = gethostbyname('www.example.com');

/* Crea un socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (
$socket === false) {
echo
"socket_create() ha fallado: razón: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo
"OK.\n";
}

echo
"Intentando conectar a '$address' en el puerto '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if (
$result === false) {
echo
"socket_connect() ha fallado.\nRazó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 .= "Connexion: Cerrada\r\n\r\n";
$out = '';

echo
"Enviando una solicitud HTTP HEAD...";
socket_write($socket, $in, strlen($in));
echo
"OK.\n";

echo
"Leyendo la respuesta:\n\n";
$buf = 'Este es mi búfer.';
if (
false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo
"$bytes bytes leídos desde socket_recv(). Cerrando el socket...";
} else {
echo
"socket_recv() ha fallado; razón: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);

echo
$buf . "\n";
echo
"OK.\n\n";
?>

El resultado del ejemplo sería algo similar a:

<h2>Conexión TCP/IP</h2>
OK.
Intentando conectar a '208.77.188.166' en el puerto '80'...OK.
Enviando una solicitud HTTP HEAD...OK.
Leyendo la respuesta:

123 bytes leídos desde socket_recv(). Cerrando el socket...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
Connexion : Cerrada
Content-Type: text/html; charset=UTF-8

OK.