Signatur
Beschreibung
socket_sendto() sendet Daten über einen Socket an eine explizit angegebene Zieladresse und einen Zielport. Im Gegensatz zu socket_send() muss der Socket nicht verbunden sein – die Zieladresse wird bei jedem Aufruf direkt angegeben. Das macht die Funktion besonders nützlich für verbindungslose Protokolle wie UDP.
Der Parameter $length bestimmt, wie viele Bytes aus $data tatsächlich gesendet werden. Wenn $length größer als die Länge von $data ist, wird er stillschweigend auf die tatsächliche Länge von $data begrenzt. Dies erlaubt es, gezielt nur einen Teil eines Daten-Strings zu übertragen.
Typische Einsatzgebiete sind UDP-basierte Kommunikation, z. B. DNS-Anfragen, Logging-Protokolle (syslog), Echtzeit-Datenübertragung oder einfache Broadcast-Nachrichten in lokalen Netzwerken. Für verbindungsorientierte Protokolle wie TCP ist hingegen socket_write() oder socket_send() die bessere Wahl.
Tritt ein Fehler auf, kann der Fehlercode mit socket_last_error() und eine lesbare Fehlermeldung mit socket_strerror() abgerufen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | Socket | Eine gültige Socket-Ressource, die zuvor mit socket_create() erzeugt wurde. |
|
| $data Pflicht | string | Die zu sendenden Daten als Zeichenkette. | |
| $length Pflicht | int | Anzahl der Bytes aus $data, die tatsächlich gesendet werden sollen. Darf die tatsächliche Länge von $data nicht überschreiten. |
|
| $flags Pflicht | int | Eine Kombination von Flags, z. B. MSG_OOB, MSG_DONTROUTE oder MSG_DONTWAIT. Im Regelfall wird 0 übergeben. |
|
| $address Pflicht | string | Die IP-Adresse des Ziel-Hosts als Zeichenkette (z. B. '192.168.1.1' oder '127.0.0.1'). Bei AF_UNIX-Sockets ist dies der Pfad zur Socket-Datei. |
|
| $port | int | 0 | Der Zielport auf dem Empfänger-Host. Nur relevant bei AF_INET- und AF_INET6-Sockets; bei AF_UNIX wird dieser Parameter ignoriert. |
Rückgabewert
false zurückgegeben und der Fehler kann mit socket_last_error() ermittelt werden.Beispiele
Einfache UDP-Nachricht an einen Server senden
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die('Socket konnte nicht erstellt werden: ' . socket_strerror(socket_last_error()));
}
$message = 'Hallo UDP-Server!';
$host = '127.0.0.1';
$port = 9000;
$bytesSent = socket_sendto($socket, $message, strlen($message), 0, $host, $port);
if ($bytesSent === false) {
echo 'Fehler beim Senden: ' . socket_strerror(socket_last_error($socket));
} else {
echo "Erfolgreich {$bytesSent} Byte(s) gesendet.";
}
socket_close($socket);
UDP-Broadcast im lokalen Netzwerk
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die('Socket-Fehler: ' . socket_strerror(socket_last_error()));
}
// Broadcast auf dem Socket erlauben
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
$message = 'Server-Ankündigung: Dienst verfügbar!';
$broadcast = '255.255.255.255';
$port = 12345;
$result = socket_sendto($socket, $message, strlen($message), 0, $broadcast, $port);
if ($result === false) {
echo 'Broadcast fehlgeschlagen: ' . socket_strerror(socket_last_error($socket));
} else {
echo "Broadcast gesendet ({$result} Bytes).";
}
socket_close($socket);
// Wichtig · Fallstricke
Sicherheitshinweis: Validiere Zieladressen und Ports sorgfältig, wenn diese aus Benutzereingaben stammen, um ungewollte Verbindungen zu internen Diensten (sog. Server-Side Request Forgery) zu verhindern.
Bei UDP gibt es keine Garantie, dass Pakete ankommen oder in der gesendeten Reihenfolge empfangen werden. Für zuverlässige Übertragungen ist TCP mit socket_send() vorzuziehen.
Ab PHP 8.0 ist der erste Parameter vom Typ Socket (Objekt) statt der zuvor verwendeten Ressource. Älterer Code, der noch Ressourcen erwartet, muss entsprechend angepasst werden.