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

search for in the

socket_recvfrom> <socket_read
Last updated: Fri, 20 May 2011

view this page in

socket_recv

(PHP 4 >= 4.1.0, PHP 5)

socket_recvREcibe información desde un socket conectado

Descripción

int socket_recv ( resource $socket , string &$buf , int $len , int $flags )

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.

Parámetros

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.

Valores devueltos

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.

Ejemplos

Example #1 Un ejemplo de socket_recv()

Este ejemplo es un reescrito sencillo del primer ejemplo de Ejemplos para usar socket_recv().

<?php
error_reporting
(E_ALL);

echo 
"<h2>Conexión TCP/IP</h2>\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_INETSOCK_STREAMSOL_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$instrlen($in));
echo 
"OK.\n";

echo 
"Leyendo la respuesta:\n\n";
$buf 'Este es mi buffer.';
if (
false !== ($bytes socket_recv($socket$buf2048MSG_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:

<h2>Conexión TCP/IP</h2>
OK.
Intentando conectar a '208.77.188.166' en el puerto '80'...OK.
Enviando petición HTTP HEAD...OK.
Leyendo la respuesta:

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.



socket_recvfrom> <socket_read
Last updated: Fri, 20 May 2011
 
add a note add a note User Contributed Notes socket_recv
rathamahata at rathamahata dot net 25-Aug-2005 11:44
It looks like that mysterious flags are just the recv(2) flags passed to your OS syscall and nothing more...

ext/sockets/sockets.c:PHP_FUNCTION(socket_recv)
...
        if ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags)) < 1) {
                efree(recv_buf);
...

for linux you can type `man 2 recv' and you will see complete description of thouse flags.

Sergey S. Kosrtyliov <rathamahata@rathamahata.net>
http://www.rathamahata.net/
06-May-2005 11:59
My last post was incorrect. The int flag set to 2 apparently reset the file position pointer so what I was reading was the first record repeatedly.

My workaroud ended up being the following:

for($ct=1; $ct<=$numrecs; $ct++) {
    $rec = "";
    $nr=socket_recv($fp,$rec,76,0);
       
    //grab the extra bytes.
    $terminator = "";
    while ($terminator != ".") {
        $nr=socket_recv($fp,$terminator,1,0);
    }
   
     $custarray[]=substr($rec,0,76);        
}

Martin K.
05-May-2005 02:42
I'm glad that Bastion left the above post about the mysterious int flag. He just helped to fix a problem that I've spent six hours on. Here's my code:

for($ct=1; $ct<=$numrecs; $ct++) {
     $rec = "";
     $nr=socket_recv($fp,$rec,77,0);
     print "Rec # $ct -->";
         print "$rec";
         print "<br>";
      }

The code is pretty simple, it just loops through all my records and prints them out. All records are 77 bytes and all end with a period. The first 36 records print perfectly then at 37 things go bad. The records start to get offset. The last few characters of the 37th record end up printing on the 38th record. The data on the sending side was perfect, so I knew that the problem was with socked_recv.

After reading the above post I tried changing the int flag. Changing the flag to 2 worked:
$nr=socket_recv($fp,$rec,77,2);

Now everything lines up perfectly. I had always left int flag as 0 since it's undocumented.

Martin K.
engine at [NO SPAM] illusiononly dot com 30-Nov-2004 12:58
To read from socket both on linux and windows OS having  flash as a client I use function bellow. $length is the size of  a chunk, not the max length to read. It will continue reading until EOL char  occures or client disconnects (or in case of error), so it works for bigger packets as well.

     function read($descriptor, $length = 1024) {
            $this->method = "read";
            if(!$client){
                echo("No valid socket descriptor !\n");
                return false;
            }
            $read ='';
        while(($flag=socket_recv($descriptor, $buf, $length,0))>0){
              $asc=ord(substr($buf, -1));
            if ($asc==0) {
                $read.=substr($buf,0,-1);
                break;
            }else{
                $read.=$buf;
            }
        }
           if ($flag<0){
            //error
            return false;
        }elseif ($flag==0){
            //Client disconnected
            return  false;
        }else{
              return $read;
        }

     }
dgk at tcde dot ru 05-Nov-2004 11:57
I've used socket_select and socket_recv with a while loop and found myself in trouble when remote side closed connection. The code below produced infinite loop and socket_select returned immediately (which lead to high cpu time consumption).

<?

socket_set_nonblock($my_socket);
$streams = array($my_socket/*, ... */);

$lastAccess = time();
while (socket_select($streams, $write = NULL, $except = NULL, SLEEP_TIME_SECONDS, SLEEP_TIME_MILLISECONDS) !== FALSE) {
    if (in_array($my_socket, $streams)) {
        while (@socket_recv($my_socket, $data, 8192, 0)) {
            echo $data;
        }
        $lastAccess = time();
    } else {
        if (time()-$lastAccess > LAST_ACCESS_TIMEOUT) {
            break;
        }
    }
    // ...
    $streams = array($my_socket/*, ... */);
}

?>

The solution was simple, but quite hard to find because socket_recv is not documented. socket_recv returns FALSE if there is no data and 0 if the socket is widowed (disconnected by remote side). So I had just to check return value of socket_recv. The problem now sounds stupid, but I've spend some time to find it out.
I hope this will save some of somebody's hair ;)
bastiaan at [no-spam] megabass dot nl 05-Apr-2004 04:35
in case you want to empty/unset $buffer, but failing to do so, try using 0 as flag.
PHP_NORMAL_READ and PHP_BINARY_READ respectively hold 1 and 2 as value.

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