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, 14 Aug 2009

view this page in

socket_recvfrom

(PHP 4 >= 4.1.0, PHP 5)

socket_recvfromReçoit des données d'une socket, connectée ou pas

Description

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

La fonction socket_recvfrom() reçoit len octets de données du buffer buf depuis name sur le port port (si la socket n'est pas du type AF_UNIX), en utilisant socket . socket_recvfrom() peut être utilisé pour récupérer les données depuis des sockets connectées ou non. De plus, un ou plusieurs drapeaux peuvent être spécifiés pour modifier ce comportement.

Les paramètres name et port doivent être passés par référence. Si la socket n'est pas connectée, name contiendra l'adresse internet de l'hôte distant ou le chemin du socket Unix. Si la socket est connectée, name vaut NULL. De plus, le paramètre port contiendra le port de l'hôte distant dans le cas d'une socket AF_INET ou AF_INET6.

Liste de paramètres

socket

Le paramètre socket doit être une ressource de socket créé par la fonction socket_create().

buf

Les données récupérées seront placées dans la variable spécifiée par ce paramètre.

len

Jusqu'à len octets doivent être récupérés de l'hôte distant.

flags

La valeur de ce paramètre peut être une combinaison des drapeaux suivants, joints par un OU binaire (|).

Valeurs possibles pour flags
Drapeau Description
MSG_OOB Processus en dehors de la bande de données.
MSG_PEEK Reçoit les données depuis le début de la file de réception sans les supprimer de cette file.
MSG_WAITALL Bloc tant qu'au moins len octets n'ont pas été reçus. Cependant, si un signal est reçu ou l'hôte distant se déconnecte, la fonction pourra retourner moins de données.
MSG_DONTWAIT Lorsque ce drapeau est défini, la fonction retourne des données même si elle devrait rester bloquer.
name

Si la socket est du type AF_UNIX, name sera le chemin vers ce fichier. Sinon, pour les sockets non-connectées, name est l'adresse IP de l'hôte distant, ou NULL si la socket est connectée.

port

Cet argument ne s'applique qu'aux sockets AF_INET et AF_INET6, et spécifie le port distant depuis lequel les données sont reçues. Si la socket est connectée, port vaudra NULL.

Valeurs de retour

socket_recvfrom() retourne le nombre d'octets reçus, ou -1 si une erreur survient. Le code erreur actuel peut être retrouvé en appelant la fonction socket_last_error(). Ce code erreur peut être passé à la fonction socket_strerror() afin de récupérer une explication textuelle de l'erreur.

Exemples

Exemple #1 Exemple avec 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 
"Réception de $buf depuis l'adresse distant $from et du port distant $portPHP_EOL;
?>

Cet exemple initialise une socket UDP sur le port 1223 de l'adresse 127.0.0.1 et affiche au moins 12 caractères reçus depuis l'hôte distant.

Historique

Version Description
4.3.0 socket_recvfrom() est maintenant compatible avec les données binaires.

Voir aussi



socket_select> <socket_recv
Last updated: Fri, 14 Aug 2009
 
add a note add a note User Contributed Notes
socket_recvfrom
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

socket_select> <socket_recv
Last updated: Fri, 14 Aug 2009
 
 
show source | credits | sitemap | contact | advertising | mirror sites