socket_recv
REcibe información desde un socket conectado
&reftitle.description;
intsocket_recv
resourcesocket
stringbuf
intlen
intflags
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.
&reftitle.parameters;
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.
&reftitle.returnvalues;
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.
&reftitle.examples;
Un ejemplo de socket_recv
Este ejemplo es un reescrito sencillo del primer ejemplo de
para
usar socket_recv.
Conexión TCP/IP\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:
Conexión TCP/IP
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.
]]>