PHP 8.5.0 Alpha 1 available for testing

socket_recvfrom

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

socket_recvfromRecibe datos de un socket, conectado o no

Descripción

socket_recvfrom(
    Socket $socket,
    string &$data,
    int $length,
    int $flags,
    string &$address,
    int &$port = null
): int|false

La función socket_recvfrom() recibe length bytes de datos del buffer data desde address en el puerto port (si el socket no es del tipo AF_UNIX), utilizando socket. socket_recvfrom() puede ser utilizado para recuperar los datos desde sockets conectadas o no. Asimismo, uno o varios flags pueden ser especificados para modificar este comportamiento.

Los parámetros address y port deben ser pasados por referencia. Si el socket no está conectado, address contendrá la dirección internet del host remoto o la ruta del socket Unix. Si el socket está conectado, address valdrá null. Asimismo, el parámetro port contendrá el puerto del host remoto en el caso de un socket AF_INET o AF_INET6.

Nota: Esta función es segura binariamente.

Parámetros

socket

El parámetro socket debe ser una instancia de Socket creada por socket_create().

data

Los datos recuperados serán colocados en la variable especificada por este parámetro.

length

Hasta length bytes deben ser recuperados del host remoto.

flags

El valor de este parámetro puede ser una combinación de los flags siguientes, unidos por un OR binario (|).

Valores posibles para flags
Flag Descripción
MSG_OOB Procesamiento fuera de la banda de datos.
MSG_PEEK Recibe los datos desde el inicio de la cola de recepción sin eliminarlos de esta cola.
MSG_WAITALL Bloquea hasta que al menos length bytes hayan sido recibidos. Sin embargo, si se recibe una señal o el host remoto se desconecta, la función podrá retornar menos datos.
MSG_DONTWAIT Cuando este flag está definido, la función retorna datos incluso si debería permanecer bloqueada.
address

Si el socket es del tipo AF_UNIX, address será la ruta hacia este fichero. De lo contrario, para los sockets no-conectados, address es la dirección IP del host remoto, o null si el socket está conectado.

port

Este argumento solo se aplica a los sockets AF_INET y AF_INET6, y especifica el puerto remoto desde el cual los datos son recibidos. Si el socket está conectado, port valdrá null.

Valores devueltos

socket_recvfrom() retorna el número de bytes recibidos, o false si ocurre un error. El código de error actual puede ser obtenido llamando a la función socket_last_error(). Este código de error puede ser pasado a la función socket_strerror() para obtener una explicació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 Ejemplo con socket_recvfrom()

<?php

$socket
= socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 1223);

$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 12, 0, $from, $port);

echo
"Recepción de $buf desde la dirección remota $from y del puerto remoto $port" . PHP_EOL;
?>

Este ejemplo inicializa un socket UDP en el puerto 1223 de la dirección 127.0.0.1 y muestra al menos 12 caracteres recibidos desde el host remoto.

Ver también

add a note

User Contributed Notes 4 notes

up
3
lorin dot weilenmann at gmail dot com
9 years ago
If you use socket_recvfrom on a UDP socket and combine it with the MSG_DONTWAIT flag, it will raise a PHP Warning if there is nothing to read. AFAIK, there is no way around that warning except suppressing it with @ (i.e. you cannot check if there is data before calling socket_recvfrom).
up
2
ply2attoetensen-project.com
8 years ago
MSG_DONTWAIT doesn't seem to exist in windows sockets. However socket_set_nonblock() seems to do the trick.
up
1
davide dot renzi at gmail dot com
13 years ago
Pay attention! On some PHP version the MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)
up
-3
jaggerwang at gmail dot com
17 years ago
I'm confused about the rerturn value of socket_recvfrom(), it said -1 when failed, but when I call like this:

if (($len = @socket_recvfrom($sock, $result, 32, 0, $ip, $port)) == -1) {
if ($this->_debug) {
echo "socket_read() failed: " . socket_strerror(socket_last_error()) . "\n";
}
return false;
}

variable $len = false, when I change the buffer length from 32 to 4096, it becomes right.
To Top