Start · Sprachen · PHP · Referenz · socket_wsaprotocol_info_import

socket_wsaprotocol_info_import

Funktion

Importiert einen Socket aus einem anderen Prozess auf Windows anhand eines WSAPROTOCOL_INFO-Strings.

seit PHP 8.0.0 Kategorie: http

Signatur

socket_wsaprotocol_info_import(string $info_string): Socket|false

Beschreibung

socket_wsaprotocol_info_import() ist das Gegenstück zu socket_wsaprotocol_info_export() und ermöglicht es, einen Socket, der in einem anderen Prozess exportiert wurde, in den aktuellen Prozess zu importieren. Die Funktion steht ausschließlich unter Windows zur Verfügung und nutzt die Windows Sockets API (WSA).

Typischer Anwendungsfall ist die prozessübergreifende Socket-Weitergabe: Ein übergeordneter Prozess (z. B. ein Master-Prozess) erstellt einen Socket und exportiert dessen WSAPROTOCOL_INFO-Daten als String. Dieser String wird an einen Kindprozess (z. B. per Shared Memory, Pipe oder IPC) übergeben, der den Socket mit socket_wsaprotocol_info_import() reaktiviert und weiternutzen kann.

Die Funktion gibt bei Erfolg ein Socket-Objekt zurück (ab PHP 8.0; davor eine Ressource), das sofort für alle Socket-Operationen wie Senden, Empfangen oder Verbinden verwendet werden kann. Schlägt der Import fehl, wird false zurückgegeben und ein Fehler kann über socket_last_error() abgefragt werden.

Hinweis: Diese Funktion ist nur unter Windows verfügbar. Auf Unix/Linux-Systemen existiert sie nicht; dort können Sockets über andere Mechanismen (z. B. socket_cmsg_space() und SCM_RIGHTS) weitergegeben werden.

Parameter

Name Typ Default Beschreibung
$info_string Pflicht string Der Protokollinformations-String, der zuvor mit socket_wsaprotocol_info_export() erzeugt wurde und die WSAPROTOCOL_INFO-Struktur des zu importierenden Sockets enthält.

Rückgabewert

Typ
Socket|false
Beschreibung
Gibt bei Erfolg ein Socket-Objekt zurück, das den importierten Socket repräsentiert. Im Fehlerfall wird false zurückgegeben; der Fehlercode kann mit socket_last_error() abgerufen werden.

Beispiele

Socket zwischen zwei PHP-Prozessen auf Windows teilen

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

socket_bind($socket, '127.0.0.1', 12345);
socket_listen($socket);

// PID des aktuellen Prozesses ermitteln
$pid = getmypid();

// Socket-Info exportieren (für den aktuellen Prozess selbst, zur Demo)
$infoString = socket_wsaprotocol_info_export($socket, $pid);
if ($infoString === false) {
    die('Export fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

echo 'Exportierter Info-String (gekürzt): ' . substr($infoString, 0, 32) . '...' . PHP_EOL;

// Socket importieren (normalerweise im Kindprozess)
$importedSocket = socket_wsaprotocol_info_import($infoString);
if ($importedSocket === false) {
    die('Import fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

echo 'Socket erfolgreich importiert.' . PHP_EOL;

// Aufräumen
socket_wsaprotocol_info_release($infoString);
socket_close($importedSocket);
socket_close($socket);
Exportierter Info-String (gekürzt): ... Socket erfolgreich importiert.

Fehlerbehandlung beim Import

<?php
// Ungültigen Info-String übergeben
$result = socket_wsaprotocol_info_import('ungueltig');

if ($result === false) {
    $errorCode = socket_last_error();
    echo 'Import fehlgeschlagen. Fehlercode: ' . $errorCode . PHP_EOL;
    echo 'Fehlermeldung: ' . socket_strerror($errorCode) . PHP_EOL;
} else {
    echo 'Socket importiert.' . PHP_EOL;
}
Import fehlgeschlagen. Fehlercode: 10022 Fehlermeldung: Invalid argument

// Wichtig · Fallstricke

Nur Windows: Diese Funktion ist ausschließlich auf Windows-Systemen verfügbar (WSA = Windows Sockets API). Ein Aufruf auf anderen Betriebssystemen führt zu einem fatalen Fehler.

Ressourcenfreigabe: Nach dem Import sollte der exportierte Info-String mit socket_wsaprotocol_info_release() freigegeben werden, um Ressourcenlecks auf Windows-Seite zu vermeiden.

Prozess-ID beachten: Beim Export mit socket_wsaprotocol_info_export() muss die korrekte Ziel-Prozess-ID angegeben werden. Nur der Zielprozess kann den Socket erfolgreich importieren.

PHP-Version: Ab PHP 8.0 wird ein Socket-Objekt zurückgegeben; in PHP 7.x wurde eine Ressource (resource) zurückgegeben.