Start · Sprachen · PHP · Referenz · socket_atmark

socket_atmark

Funktion

Ermittelt, ob sich der Socket an der Out-of-Band-Marke (OOB-Marke) befindet und gibt entsprechend 1, 0 oder <code>false</code> zurück.

seit PHP 8.0.0 Kategorie: http

Signatur

socket_atmark(Socket $socket): int|false

Beschreibung

socket_atmark() prüft, ob der Lese-Zeiger des angegebenen Sockets an der sogenannten Out-of-Band-Marke (OOB-Mark) steht. Out-of-Band-Daten (auch urgent data genannt) sind spezielle, mit höherer Priorität übertragene Daten im TCP-Protokoll, die außerhalb des normalen Datenstroms gesendet werden.

Die Funktion ist besonders nützlich, wenn man in einer Empfangsschleife prüfen möchte, ob gerade OOB-Daten zur Verfügung stehen, bevor man sie mit socket_recv() und dem Flag MSG_OOB ausliest. So kann man normalen Datenfluss und dringende Steuernachrichten (z. B. aus Telnet-Sitzungen) sauber trennen.

Gibt die Funktion 1 zurück, befindet sich der Socket genau an der OOB-Marke und OOB-Daten können gelesen werden. Bei 0 gibt es keine OOB-Marke an der aktuellen Position. false deutet auf einen Fehler hin, der mit socket_last_error() abgefragt werden kann.

Hinweis: Diese Funktion entspricht dem POSIX-Systemaufruf sockatmark() und ist primär auf UNIX-ähnlichen Systemen (Linux, macOS) verfügbar. Unter Windows ist die Unterstützung eingeschränkt.

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Eine gültige Socket-Instanz, wie sie von socket_create() oder socket_accept() erzeugt wurde.

Rückgabewert

Typ
int|false
Beschreibung
Gibt 1 zurück, wenn der Socket an der Out-of-Band-Marke steht, 0 wenn nicht, oder false bei einem Fehler. Im Fehlerfall kann der genaue Fehler mit socket_last_error() und socket_strerror() ermittelt werden.

Beispiele

OOB-Marke prüfen und OOB-Daten lesen

<?php
// Socket erstellen und mit einem Server verbinden
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

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

// Normalen Datenstrom empfangen, bis OOB-Marke erreicht wird
while (true) {
    $atMark = socket_atmark($socket);
    if ($atMark === false) {
        echo 'Fehler: ' . socket_strerror(socket_last_error($socket)) . PHP_EOL;
        break;
    }

    if ($atMark === 1) {
        // An der OOB-Marke: OOB-Daten einlesen
        $oobData = '';
        $bytes = socket_recv($socket, $oobData, 1, MSG_OOB);
        if ($bytes !== false) {
            echo 'OOB-Daten empfangen: ' . bin2hex($oobData) . PHP_EOL;
        }
        break;
    }

    // Normale Daten lesen
    $buf = '';
    $bytes = socket_recv($socket, $buf, 1024, 0);
    if ($bytes === false || $bytes === 0) {
        echo 'Verbindung getrennt oder Fehler.' . PHP_EOL;
        break;
    }
    echo 'Normale Daten: ' . $buf . PHP_EOL;
}

socket_close($socket);

Einfache Statusabfrage mit Fehlerbehandlung

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 12345);

$result = socket_atmark($socket);

switch ($result) {
    case 1:
        echo 'Socket steht an der Out-of-Band-Marke.' . PHP_EOL;
        break;
    case 0:
        echo 'Keine Out-of-Band-Marke an der aktuellen Position.' . PHP_EOL;
        break;
    default:
        echo 'Fehler beim Prüfen der OOB-Marke: '
            . socket_strerror(socket_last_error($socket)) . PHP_EOL;
        break;
}

socket_close($socket);
Keine Out-of-Band-Marke an der aktuellen Position.

// Wichtig · Fallstricke

Plattformabhängigkeit: socket_atmark() ist intern auf den POSIX-Syscall sockatmark() abgebildet. Unter Windows kann das Verhalten abweichen oder die Funktion nicht wie erwartet funktionieren. Für portable Anwendungen sollte dies berücksichtigt werden.

Klassen-API: Ab PHP 8.0.0 wird statt der alten Ressource ein Socket-Objekt verwendet. Ältere Versionen nutzten eine resource als Parameter, weshalb diese Funktion in der aktuellen Form erst ab PHP 8.0.0 verfügbar ist.

OOB-Daten in der Praxis: Out-of-Band-Daten werden selten verwendet und sind im modernen Anwendungsdesign meist durch separate Steuerverbindungen ersetzt worden. Bekannte Anwendungsfälle sind das Telnet-Protokoll und ältere FTP-Implementierungen.