Signatur
Beschreibung
stream_socket_sendto() überträgt Daten über einen vorhandenen Socket-Stream. Die Funktion eignet sich sowohl für verbundene Sockets (z. B. TCP) als auch für verbindungslose Protokolle wie UDP, bei denen jedes Paket an eine beliebige Zieladresse gesendet werden kann.
Wird der optionale Parameter address angegeben, wird das Datagramm an diese Adresse übermittelt, anstatt an den beim Verbindungsaufbau festgelegten Endpunkt. Das Format der Adresse entspricht dem, das auch stream_socket_client() und stream_socket_server() akzeptieren, z. B. udp://192.168.1.1:9000.
Der Parameter flags erlaubt es, zusätzliche Optionen zu setzen. Aktuell wird STREAM_OOB unterstützt, um Out-of-Band-Daten zu senden. In den meisten Anwendungsfällen kann dieser Parameter auf 0 belassen werden.
Die Funktion ist besonders nützlich in UDP-basierten Anwendungen wie einfachen Benachrichtigungssystemen, DNS-Clients oder Logging-Diensten, bei denen keine feste Verbindung zu einem Ziel hergestellt werden muss.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | resource | Ein gültiger Socket-Stream, der z. B. mit stream_socket_client() oder stream_socket_server() erstellt wurde. |
|
| $data Pflicht | string | Die zu sendenden Daten als Zeichenkette. Bei binären Protokollen sollte darauf geachtet werden, dass die Daten korrekt kodiert sind. | |
| $flags | int | 0 | Optionale Flags. Derzeit wird STREAM_OOB unterstützt, um Out-of-Band-Daten zu senden. Normalerweise 0. |
| $address | string | Optionale Zieladresse im Format protokoll://host:port, z. B. udp://127.0.0.1:514. Wird diese angegeben, überschreibt sie die beim Verbindungsaufbau gesetzte Adresse. |
Rückgabewert
false zurückgegeben. Eine Rückgabe von 0 ist möglich, wenn keine Daten gesendet werden konnten (z. B. bei einem vollen Puffer).Beispiele
UDP-Nachricht an eine Adresse senden (verbindungslos)
<?php
// Socket ohne feste Verbindung erstellen
$socket = stream_socket_client('udp://0.0.0.0:0', $errno, $errstr);
if (!$socket) {
die("Fehler: $errstr ($errno)\n");
}
$nachricht = 'Hallo UDP-Server!';
$gesendet = stream_socket_sendto($socket, $nachricht, 0, 'udp://127.0.0.1:9000');
if ($gesendet === false) {
echo "Senden fehlgeschlagen.\n";
} else {
echo "Gesendet: $gesendet Bytes\n";
}
fclose($socket);
Syslog-Nachricht per UDP senden
<?php
// Einfaches UDP-Syslog-Beispiel (RFC 3164)
$socket = stream_socket_client('udp://0.0.0.0:0', $errno, $errstr);
if (!$socket) {
die("Socket-Fehler: $errstr ($errno)\n");
}
$prioritaet = 134; // facility: local0 (16), severity: info (6) => (16*8)+6 = 134
$hostname = gethostname();
$datum = date('M j H:i:s');
$meldung = "<$prioritaet>$datum $hostname myapp: Anwendung gestartet";
$bytes = stream_socket_sendto($socket, $meldung, 0, 'udp://192.168.1.10:514');
echo "Syslog-Nachricht gesendet: $bytes Bytes\n";
fclose($socket);
// Wichtig · Fallstricke
Pufferlimit: Bei UDP-Sockets kann die Größe eines einzelnen Datagramms durch das Betriebssystem begrenzt sein (typischerweise 65.507 Bytes für IPv4). Größere Daten müssen in mehrere Pakete aufgeteilt werden.
Kein Empfangsnachweis bei UDP: Da UDP verbindungslos ist, gibt es keine Garantie, dass das Paket tatsächlich angekommen ist. Der Rückgabewert bestätigt nur das lokale Senden, nicht den Empfang.
TCP-Sockets: Bei verbundenen TCP-Sockets sollte der Parameter address leer gelassen werden, da die Zieladresse bereits durch den Verbindungsaufbau festgelegt ist. Das Angeben einer abweichenden Adresse kann zu Fehlern führen.
Nicht-blockierender Modus: Wenn der Socket mit stream_set_blocking($socket, false) in den nicht-blockierenden Modus versetzt wurde, kann stream_socket_sendto() 0 zurückgeben, wenn der Sendepuffer voll ist.