downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

socket_select> <socket_recv
Last updated: Fri, 20 May 2011

view this page in

socket_recvfrom

(PHP 4 >= 4.1.0, PHP 5)

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

Descripción

int socket_recvfrom ( resource $socket , string &$buf , int $len , int $flags , string &$name [, int &$port ] )

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.

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

Example #1 Un ejemplo de socket_recvfrom()

<?php
error_reporting
(E_ALL E_STRICT);

$socket socket_create(AF_INETSOCK_DGRAMSOL_UDP);
socket_bind($socket'127.0.0.1'1223);

$from '';
$port 0;
socket_recvfrom($socket$buf120$from$port);

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

Historial de cambios

Versión Descripción
4.3.0 socket_recvfrom() ahora es segura a nivel binario.

Ver también



socket_select> <socket_recv
Last updated: Fri, 20 May 2011
 
add a note add a note User Contributed Notes socket_recvfrom
rmayo100 at yahoo dot com 16-Apr-2010 02:13
I said in my previous note that I'd add a secondary post when I found out more about how to use socket_recvfrom().  So here it is.

As I suspected, the example given is dead-flat-wrong and should be avoided.  You WILL need to use pointers like the description at the top of the page says.  My working socket_recvfrom() command looks like this:

     $bytes = socket_recvfrom ($socket, &$udp_reply, 100, 0, &$from_addr, &$from_port);

Also, even if you have no interest in the the information at all, you must create the $from_addr and $from_port variables and pass them by reference.  PHP doesn't support passing in NULL just because you might not give a rat's patootie about the information....    ;)

R.
rmayo100 at yahoo dot com 14-Apr-2010 05:27
The example doesn't match the format described at the top of the page.  It appears to me that to use this command to receive UDP data, I need to format my calling parameter as follows:

int socket_recvfrom
(
    resource $socket,        //  Created this with socket_create
    string     &$buf,        //   This is a pointer!!
    int         $len,        //    I know the amount of data
    int         $flags,      //   I know the flags I want
    string     &$name,       //   This is ALSO a pointer!
    int         &$port       //   This is ALSO a pointer, TOO!!
);

The example doesn't use any pointers, just values, and I didn't think socket_bind was necessary for UDP sockets.  At least, it isn't in C.  Anybody got a example that does work??  (Because this doesn't see to so far.)

If I do stumble on a combination of settings that works, I'll post it -- but this doesn't seem to be the most active page on PHP.net....

R.
jaggerwang at gmail dot com 08-Nov-2007 05:56
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.
ryan_at_ryanfisher_dot_com 02-Oct-2006 05:27
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);
}
?>
tsuna at tsunaquack d0t c0m 21-Feb-2005 11:17
This function is very handy when dealing with UDP connections, because it enables you to know who's the client who connected to your socket. Bear in mind that UDP doesn't care about the source of the connection, the packets may be annonymous or even faked. No check is required.

If you want to listen on an UDP socket and answer to the client, read my comment on socket_listen() -> http://www.php.net/manual/en/function.socket-listen.php

 
show source | credits | stats | sitemap | contact | advertising | mirror sites