Start · Sprachen · PHP · Referenz · socket_sendto

socket_sendto

Funktion

Sendet eine Nachricht über einen Socket an eine angegebene Adresse, unabhängig davon, ob der Socket verbunden ist.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_sendto(Socket $socket, string $data, int $length, int $flags, string $address, int $port = 0): int|false

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

Typ
int|false
Beschreibung
Gibt die Anzahl der tatsächlich gesendeten Bytes zurück. Im Fehlerfall wird 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);
Erfolgreich 18 Byte(s) gesendet.

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);
Broadcast gesendet (37 Bytes).

// 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.