Signatur
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
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);
// 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.