(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_recv — Recibe datos de un socket conectado
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
.
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
(|
).
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. |
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.
Versión | Descripción |
---|---|
8.0.0 |
socket is a Socket instance now;
previously, it was a resource.
|
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.