(PHP 4 >= 4.1.0, PHP 5)
socket_recv — Reçoit des données d'une socket connectée
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ées. Aussi, des drapeaux permettent de changer le comportement de la fonction.
buf est passé par référence, il doit donc être présente dans la liste des arguments. Les données reçues depuis la socket par socket_recv() seront retournées dans buf.
socket doit être une ressource de socket précédemment créee par socket_create().
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 alors NULL.
Jusqu'à len octets seront lus depuis l'hôte distant.
La valeur de flags peut être une combinaison des drapeaux suivants, groupés au moyen de l'opérateur binaire OR (|).
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é. |
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.
Exemple #1 Exemples avec socket_recv()
Cet exemple est une réécriture de l'exemple pris sur Exemples pour utiliser 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 une 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 .= "Connection: Close\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 de la 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: Fermeture de la 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.