socket_recv
(PHP 4 >= 4.1.0, PHP 5)
socket_recv — Reçoit des données d'un socket connecté
Description
$socket
, string &$buf
, int $len
, int $flags
)
La fonction socket_recv() reçoit
len
octets de données dans buf
depuis
socket
. socket_recv() peut être utilisée
pour récupérer des données depuis des sockets connectés. Aussi, des drapeaux
permettent de changer le comportement de la fonction.
buf
est passé par référence, il doit donc être présent
dans la liste des arguments. Les données reçues depuis la
socket
par socket_recv()
seront retournées dans buf
.
Liste de paramètres
-
socket
-
socket
doit être une ressource de socket précédemment créée par socket_create(). -
buf
-
Les données reçues seront transmises dans
buf
. Si une erreur survient, si la connexion est fermée ou si aucune donnée n'est disponible,buf
vaudra alorsNULL
. -
len
-
Jusqu'à
len
octets seront lus depuis l'hôte distant. -
flags
-
La valeur de
flags
peut être une combinaison des drapeaux suivants, groupés au moyen de l'opérateur binaire OR (|).Valeurs possibles de flags
Flag Description MSG_OOB
Traite des données hors de bande. MSG_PEEK
Reçoit les données depuis le début de la queue sans pour autant les supprimer de la queue. MSG_WAITALL
Bloque avant qu'au moins len
sont reçues. Cependant, si un signal est intercépté ou si la connexion est terminée, la fonction pourra retourner moins de données.MSG_DONTWAIT
Si ce drapeau est spécifié, la fonction retournera ses données alors qu'en temps normal elle aurait bloqué.
Valeurs de retour
socket_recv() retourne le nombre d'octets reçus,
ou FALSE
si une erreur est apparue. Le code d'erreur actuel peut être
récupéré en appelant socket_last_error(). Ce code
d'erreur peut être passé à la fonction socket_strerror()
pour avoir une représentation textuelle de l'erreur.
Exemples
Exemple #1 Exemples avec socket_recv()
<?php error_reporting(E_ALL); echo "<h2>TCP/IP Connection</h2>\n"; /* Récupère le port du service WWW. */ $service_port = getservbyname('www', 'tcp'); /* Récupère l'adresse IP de l'hôte cible. */ $address = gethostbyname('www.example.com'); /* Crée un socket TCP/IP. */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() a échoué: raison: " . socket_strerror(socket_last_error()) . "\n"; } else { echo "OK.\n"; } echo "Tentative de connexion à '$address' sur le port '$service_port'..."; $result = socket_connect($socket, $address, $service_port); if ($result === false) { echo "socket_connect() a échoué.\nRaison: ($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 .= "Connexion: Fermée\r\n\r\n"; $out = ''; echo "Envoi d'une requête HTTP HEAD..."; socket_write($socket, $in, strlen($in)); echo "OK.\n"; echo "Lecture de la réponse:\n\n"; $buf = 'Ceci est mon buffer.'; if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) { echo "$bytes octets lus depuis socket_recv(). Fermeture du socket..."; } else { echo "socket_recv() a échoué; raison: " . socket_strerror(socket_last_error($socket)) . "\n"; } socket_close($socket); echo $buf . "\n"; echo "OK.\n\n"; ?>
L'exemple ci-dessus produit un résultat ressemblant à celà:
<h2>TCP/IP Connection</h2> OK. Tentative de connexion à '208.77.188.166' sur le port '80'...OK. Envoi d'une requête HTTP HEAD...OK. Lecture de la réponse: 123 octets lus depuis socket_recv(). Fermeture du 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 Connexion : Fermée Content-Type: text/html; charset=UTF-8 OK.