Start · Sprachen · PHP · Referenz · socket_send

socket_send

Funktion

Sendet Daten über einen verbundenen Socket und gibt die Anzahl der gesendeten Bytes zurück.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_send(Socket $socket, string $data, int $length, int $flags): int|false

Beschreibung

socket_send() überträgt Daten über einen zuvor verbundenen Socket. Im Gegensatz zu socket_sendto() setzt diese Funktion eine bestehende Verbindung voraus (TCP oder verbundenes UDP). Sie ist besonders geeignet für Client-Server-Kommunikation, bei der zuerst socket_connect() bzw. socket_accept() aufgerufen wurde.

Der Parameter $length bestimmt, wie viele Bytes aus $data maximal gesendet werden. Es ist wichtig zu beachten, dass die Funktion möglicherweise weniger Bytes sendet, als angefordert wurden – in diesem Fall muss die Anwendung den Sendevorgang in einer Schleife wiederholen, bis alle Daten übertragen sind.

Über den $flags-Parameter lässt sich das Verhalten der Funktion steuern, z. B. mit MSG_OOB für Out-of-Band-Daten oder MSG_DONTROUTE um Routing zu umgehen. In den meisten Anwendungsfällen wird 0 als Flag verwendet.

Bei einem Fehler gibt die Funktion false zurück. Mit socket_last_error() und socket_strerror() lässt sich der genaue Fehlergrund ermitteln.

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Ein gültiges Socket-Objekt, das zuvor mit socket_create() erzeugt und mit socket_connect() oder socket_accept() verbunden wurde.
$data Pflicht string Die zu sendenden Daten als Zeichenkette. Können Text oder binäre Daten enthalten.
$length Pflicht int Die maximale Anzahl der zu sendenden Bytes aus $data. Darf die tatsächliche Länge von $data nicht überschreiten.
$flags Pflicht int 0 Steuert das Sendeverhalten. Mögliche Werte (kombinierbar per bitweisem ODER): MSG_OOB (Out-of-Band-Daten senden), MSG_EOR (Ende eines Datensatzes markieren), MSG_EOF (Verbindungsende senden), MSG_DONTROUTE (Routing umgehen). Im Normalfall 0 verwenden.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der tatsächlich gesendeten Bytes zurück. Dies kann kleiner sein als der angeforderte $length-Wert. Bei einem Fehler wird false zurückgegeben; der Fehlercode ist dann über socket_last_error() abrufbar.

Beispiele

Einfache Nachricht über TCP-Socket senden

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

$result = socket_connect($socket, '127.0.0.1', 8080);
if ($result === false) {
    die('socket_connect() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

$message = "Hallo Server!";
$bytesSent = socket_send($socket, $message, strlen($message), 0);

if ($bytesSent === false) {
    echo 'Fehler beim Senden: ' . socket_strerror(socket_last_error($socket));
} else {
    echo "Erfolgreich {$bytesSent} Byte(s) gesendet.";
}

socket_close($socket);
Erfolgreich 13 Byte(s) gesendet.

Zuverlässiges Senden in einer Schleife (vollständige Übertragung sicherstellen)

<?php
function socket_send_all(Socket $socket, string $data): int|false
{
    $total = strlen($data);
    $sent  = 0;

    while ($sent < $total) {
        $chunk = socket_send($socket, substr($data, $sent), $total - $sent, 0);
        if ($chunk === false) {
            echo 'Sendefehler: ' . socket_strerror(socket_last_error($socket)) . PHP_EOL;
            return false;
        }
        $sent += $chunk;
    }

    return $sent;
}

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);

$payload = str_repeat('A', 65536); // 64 KB Testdaten
$result  = socket_send_all($socket, $payload);

if ($result !== false) {
    echo "Alle {$result} Bytes erfolgreich gesendet.";
}

socket_close($socket);
Alle 65536 Bytes erfolgreich gesendet.

// Wichtig · Fallstricke

Teilsendungen: socket_send() garantiert nicht, dass alle Bytes in einem einzigen Aufruf gesendet werden. Besonders bei großen Datenmengen oder ausgelastetem Netzwerkpuffer kann der Rückgabewert kleiner als $length sein. Verwende daher stets eine Sendeschleife, die so lange wiederholt, bis alle Daten übertragen wurden.

Sicherheit: Daten, die über Sockets gesendet werden, sollten vor der Übertragung geprüft und ggf. validiert werden. Sende niemals ungeprüfte Benutzereingaben direkt über einen Socket, da dies zu Injektionsangriffen auf der Empfängerseite führen kann.

Blockierendes vs. nicht-blockierendes Verhalten: Standardmäßig blockiert socket_send(), bis Daten gesendet wurden. Im nicht-blockierenden Modus (gesetzt via socket_set_nonblock()) kann die Funktion sofort mit false und dem Fehlercode EAGAIN/EWOULDBLOCK zurückkehren, wenn der Sendepuffer voll ist.