socket_recv
Reçoit des données d'un socket connecté
&reftitle.description;
intfalsesocket_recv
Socketsocket
stringnulldata
intlength
intflags
La fonction socket_recv reçoit
length octets de données dans data 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.
data 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 data.
&reftitle.parameters;
socket
socket doit être une instance de Socket
précédemment créée par socket_create().
data
Les données reçues seront transmises dans
data. Si une erreur survient, si la connexion
est fermée ou si aucune donnée n'est disponible,
data vaudra alors &null;.
length
Jusqu'à length 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 length sont reçues.
Cependant, si un signal est intercepté 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é.
&reftitle.returnvalues;
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.
&reftitle.changelog;
&Version;
&Description;
&sockets.changelog.socket-param;
&reftitle.examples;
Exemples avec socket_recv
Cet exemple est une réécriture de l'exemple pris sur
pour utiliser
socket_recv.
TCP/IP Connection\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à:
TCP/IP Connection
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.
]]>