# socket_recv

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

socket_recv — Recibe información desde un socket conectado

### Descripción

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

La función socket_recv() recibe `len` bytes de información en `buf` desde `socket`. socket_recv() se puede usar para reunir información desde sockets conectados. Además, se pueden especificar una o más banderas para modificar el comportamiento de la función.

`buf` es pasado por referencia, por lo que debe ser especificado como una variable en la lista de argumentos. La información leída desde `socket` por socket_recv() será devuelta en `buf`.

### Parámetros

`socket`

  `socket` debe ser un recurso socket previamente creado por socket_create().

`buf`

  La información recibida será traida a la variable especifivada por `buf`. Si ocurre un error, si la conexión es reiniciada, o si no hay información disponible, `buf` será establecido a `null`.

`len`

  Se obtendrán hasta `len` bytes desde el host remoto.

`flags`

  El valor de `flags` puede ser una combinación de las siguientes banderas, unidas con el operador binario OR (`|`).

  Valores posibles de `flags`
  Bandera | Descripción
  --- | ---
  `MSG_OOB` | Procesar información fuera de banda.
  `MSG_PEEK` | Recibir informaicón desde el inicio de la cola recibida sin eliminarla de la cola.
  `MSG_WAITALL` | Bloquea hasta que al menos se reciba `len` bytes. Sin embargo, si se captura una señal o el host remoto se desconecta, la función puede devolver menos información.
  `MSG_DONTWAIT` | Con esta bandera establecida, la función devuelve incluso si normalmente habría bloqueado.

### Valores devueltos

socket_recv() devuelve el número de bytes recibidos, o `false` si hubo un error. El código de error real se puede recuperar llamando a socket_last_error(). Este código de error se puede pasar a socket_strerror() para obtener una explicación textual del error.

### Ejemplos

Ejemplo #1 Un ejemplo de socket_recv()

Este ejemplo es un reescrito sencillo del primer ejemplo de Ejemplos para usar socket_recv().

`<?php
error_reporting(E_ALL);
echo "<h2>Conexión TCP/IP</h2>\n";
/* Obtener el puerto del servicio WWW. */
$service_port = getservbyname('www', 'tcp');
/* Obtener la dirección IP del host objetivo. */
$address = gethostbyname('www.example.com');
/* Crear un socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() falló: 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() falló.\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 .= "Connection: Close\r\n\r\n";
$out = '';
echo "Enviando petición HTTP HEAD...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
echo "Leyendo la respuesta:\n\n";
$buf = 'Este es mi buffer.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo "Leídos $bytes bytes desde socket_recv(). Cerrando el socket...";
} else {
echo "socket_recv() falló; razón: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);
echo $buf . "\n";
echo "OK.\n\n";
?>`

El ejemplo de arriba producirá algo parecido a esto:

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

    Leídos 123 bytes 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
    Connection: close
    Content-Type: text/html; charset=UTF-8

    OK.