Empfängt Daten von einem verbundenen Socket

# socket_recv

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

socket_recv — Empfängt Daten von einem verbundenen Socket

### Beschreibung

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

Die Funktion socket_recv() empfängt `length` Bytes Daten in `data` von `socket`. socket_recv() kann genutzt werden, um Daten von verbundenen Sockets zu lesen. Zusätzlich können einer oder mehrere Flags angegeben werden, um das Verhalten der Funktion zu modifizieren.

`data` wird als Referenz übergeben, daher muss er als Variable in der Liste der Argumente angegeben werden. Gelesene Daten von `socket` durch socket_recv() werden in `data` zurückgegeben.

### Parameter-Liste

`socket`

  Der `socket` muss eine Socket-Instanz sein, die zuvor mit socket_create() erzeugt wurde.

`data`

  Empfangene Daten werden in die Variable geschrieben, die durch `data` spezifiziert ist. Tritt ein Fehler auf, wird die Verbindung zurückgesetzt oder, wenn keine Daten verfügbar sind, wird `data` auf `null` gesetzt.

`length`

  Maximal `length` Bytes werden von dem entfernten System abgerufen.

`flags`

  Der Wert von `flags` kann jede beliebige Kombination der folgenden Flags sein, verknüpft mit dem binären ODER- (`|`) Operator.

  Mögliche Werte von `flags`
  Flag | Beschreibung
  --- | ---
  `MSG_OOB` | Verarbeite bandexterne (out-of-band) Daten.
  `MSG_PEEK` | Lies Daten ab Anfang der Empfangs-Warteschlange, ohne die Daten aus der Warteschlange zu löschen.
  `MSG_WAITALL` | Blockiere so lange, bis mindestens `length` Daten gelesen wurden. Wenn jedoch ein Signal empfangen wurde oder der entfernte Host die Verbindung beendet, kann die Funktion auch weniger Daten zurückgeben.
  `MSG_DONTWAIT` | Wenn dieses Flag gesetzt ist, kehrt die Funktion zurück, auch wenn sie normalerweise blockieren würde.

### Rückgabewerte

socket_recv() gibt die Anzahl der empfangenen Bytes zurück oder `false`, falls ein Fehler auftrat. Der aktuelle Fehlercode kann mit socket_last_error() abgefragt werden. Dieser Fehlercode kann an die Funktion socket_strerror() übergeben werden, um eine textuelle Beschreibung des Fehlers zu erhalten.

### Changelog

Version | Beschreibung
--- | ---
8.0.0 | `socket` ist nun eine Socket-Instanz; vorher war es eine resource.

### Beispiele

Beispiel #1 socket_recv()-Beispiel

Dies ist eine einfache Umformulierung des ersten Beispiels von Beispiele unter Nutzung von socket_recv().

`<?php
error_reporting(E_ALL);
echo "<h2>TCP/IP-Verbindung</h2>\n";
/* Erhalte Port für den WWW-Service. */
$service_port = getservbyname('www', 'tcp');
/* Erhalte die IP-Adresse des Ziel Hosts. */
$address = gethostbyname('www.example.com');
/* Erzeuge ein TCP/IP-Socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() schlug fehl: Grund: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "OK.\n";
}
echo "Versuche Verbing zu '$address' auf Port '$service_port' aufzubauen...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() schulg fehl.\nGrund: ($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 "Sende HTTP HEAD Request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
echo "Lese Response:\n\n";
$buf = 'Dies ist mein Puffer.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo "Las $bytes bytes von socket_recv(). Schliesse Socket...";
} else {
echo "socket_recv() schlug fehl; Grund: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);
echo $buf . "\n";
echo "OK.\n\n";
?>`

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

    <h2>TCP/IP-Verbindung</h2>
    OK.
    Versuche Verbing zu '208.77.188.166' auf Port '80' aufzubauen...OK.
    Sende HTTP HEAD Request...OK.
    Lese Response:

    Las 123 bytes von socket_recv(). Schliesse 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