Reçoit des données d'un socket connecté

# socket_recv

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

socket_recv — Reçoit des données d'un socket connecté

### Description

function socket_recv(
Socket `$socket`,
?string `&$data`,
int `$length`,
int `$flags`
): int|false

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

### Liste de paramètres

`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 jusqu'à ce qu'au moins `length` soient 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é.

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

### Historique

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

### Exemples

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 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 .= "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 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";
    ?>

Résultat de l'exemple ci-dessus est similaire à :

    <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
    Connection: close
    Content-Type: text/html; charset=UTF-8

    OK.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open