CakeFest 2024: The Official CakePHP Conference

socket_recvfrom

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

socket_recvfromRecibe información desde un socket que esté o no orientado a conexión

Descripción

socket_recvfrom(
    resource $socket,
    string &$buf,
    int $len,
    int $flags,
    string &$name,
    int &$port = ?
): int

La función socket_recvfrom() recibe len bytes de información en buf desde name en el puerto port (si el socket no es del tipo AF_UNIX) usando socket. socket_recvfrom() se puede usar para reunir información tanto desde socket conectados como de no conectados. Además, se pueden especificar una o más banderas para modificar el comportamiento de la función.

name y port deben ser pasados por referencia. Si el socket no está orientado a conexión, name será establecido a la dirección del protocolo de internet del host remoto o a la ruta del socket UNIX. Si el socket está orientado a conxión, name es null. Además, port contendrá el puerto del host remoto en el caso de un socket AF_INET o AF_INET6 no conectado.

Nota: Esta función es segura binariamente.

Parámetros

socket

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

buf

La información recibida será recuperada a la variable especificada por buf.

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.
name

Si el socket es de tipo AF_UNIX, name es la ruta del archivo. Por lo demás, para sockets no conectados, name es la dirección IP del host remoto, o null si el socket está orientado a conexion.

port

Este argumento sólo se aplica a sockets AF_INET y AF_INET6, y especifica el puerto remoto desde el que la información es recibida. Si el socket está orientado a conexión, port será null.

Valores devueltos

socket_recvfrom() 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_recvfrom()

<?php
error_reporting
(E_ALL | E_STRICT);

$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
"Se recibió $buf desde la dirección remota $from y el puerto remoto $port" . PHP_EOL;
?>

Este ejemplo iniciará un socket UDP en el puerto 1223 de 127.0.0.1 e imprimirá al menos 12 caracteres recibidos desde un host remoto.

Ver también

add a note

User Contributed Notes 5 notes

up
3
lorin dot weilenmann at gmail dot com
8 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
1
ply2attoetensen-project.com
7 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
12 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
16 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.
up
-13
ryan_at_ryanfisher_dot_com
17 years ago
DNS RELAY USING UDP SOCKETS

<?php

while(TRUE) {
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if(
$socket === FALSE)
{
echo
'Socket_create failed: '.socket_strerror(socket_last_error())."\n";
}
if(!
socket_bind($socketD, "0.0.0.0", 53)) {
socket_close($socketD);
echo
'socket_bind failed: '.socket_strerror(socket_last_error())."\n";
}
socket_recvfrom($socket,$buf,65535,0,$clientIP,$clientPort);
$stz = bin2hex($buf);
$tx = "";
for(
$i=0;$i<(strlen($stz)-26-10)/2;$i++)
{
$e = "00";
$e[0] = $stz[$i*2+26];
$e[1] = $stz[$i*2+27];
$f = hexdec($e);
if(
$f > 0 && $f < 32) $tx .= "."; else
$tx .= sprintf("%c",$f);
}
echo
"$clientIP <".$tx.">\n";
$fp = fsockopen("udp://72.174.110.4",53,$errno,$errstr);
if (!
$fp)
{
echo
"ERROR: $errno - $errstr<br />\n";
}
else
{
fwrite($fp,$buf);
$ret = $buf;
$ret = fread($fp,667);
fclose($fp);
}
}
socket_send($socket,$ret,667,0);
}
?>
To Top