socket_recvfrom

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

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

Description

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

La fonction socket_recvfrom() reçoit length octets de données du buffer data depuis address sur le port port (si le 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 address et port doivent être passés par référence. Si le socket n'est pas connecté, address contiendra l'adresse internet de l'hôte distant ou le chemin du socket Unix. Si le socket est connecté, address vaut null. De plus, le paramètre port contiendra le port de l'hôte distant dans le cas d'un socket AF_INET ou AF_INET6.

Note: Cette fonction gère les chaînes binaires.

Liste de paramètres

socket

Le paramètre socket doit être une instance de Socket créé par socket_create().

data

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

length

Jusqu'à length 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 Bloque tant qu'au moins length 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.
address

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

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

Historique

Version Description
8.0.0 socket est désormais une instance de Socket ; auparavant, c'était une resource.

Exemples

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

Cet exemple initialise un 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.

Voir aussi

add a note add a note

User Contributed Notes 5 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
0
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
0
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
-4
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.
up
-10
ryan_at_ryanfisher_dot_com
18 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