The underlying sockpair() function does only support AF_UNIX at least on BSD and Linux.
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_create_pair — Erzeugt ein Paar nicht zu unterscheidender Sockets und speichert sie in einem Array
socket_create_pair() erzeugt zwei nicht unterscheidbare,
verbundene Sockets und speichert sie im Array pair
.
Diese Funktion wird allgemein bei der Interprozesskommunikation (IPC)
verwendet.
domain
Der Parameter domain
bestimmt die
Protokollfamilie, die von den Sockets benutzt wird. Eine komplette
Liste finden Sie bei der Funktion socket_create().
type
Der Parameter type
bestimmt den
Kommunikationstyp, den die Sockets verwenden sollen. Eine komplette
Liste finden Sie bei der Funktion socket_create().
protocol
Der Parameter protocol
legt das spezifische
Protokoll fest, das vom zurückgegebenen Socket für die Kommunikation
innerhalb der angegebenen domain
benutzt werden
soll. Der passende Wert kann ermittelt werden, indem der Name an die
Funktion getprotobyname() übergeben wird. Wenn TCP
oder UDP gewünscht werden, können auch die entsprechenden Konstanten
SOL_TCP
oder SOL_UDP
benutzt
werden.
Eine vollständige Liste aller unterstützter Protokolle finden Sie bei der Funktion socket_create().
pair
Referenz auf das Array, in das die beiden Socket-Instanzen eingefügt werden.
Gibt bei Erfolg true
zurück. Bei einem Fehler wird false
zurückgegeben.
Version | Beschreibung |
---|---|
8.0.0 |
pair ist nun ein Verweis auf ein Array von
Socket-Instanzen; vorher war es ein Verweis auf
ein Array von resources.
|
Beispiel #1 socket_create_pair()-Beispiel
<?php
$sockets = array();
/* Unter Windows muss man AF_INET benutzen */
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);
/* Socket-Paar erzeugen */
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $sockets) === false) {
echo "socket_create_pair fehlgeschlagen. Grund: ".socket_strerror(socket_last_error());
}
/* Daten senden und empfangen */
if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) {
echo "socket_write() fehlgeschlagen. Grund: ".socket_strerror(socket_last_error($sockets[0]));
}
if (($data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) {
echo "socket_read() fehlgeschlagen. Grund: ".socket_strerror(socket_last_error($sockets[1]));
}
var_dump($data);
/* Sockets schließen */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>
Beispiel #2 socket_create_pair()-IPC-Beispiel
<?php
$ary = array();
$strone = 'Nachricht vom Elternprozess.';
$strtwo = 'Nachricht vom Kindprozess.';
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) {
echo "socket_create_pair() fehlgeschlagen. Grund: ".socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if ($pid == -1) {
echo 'Konnte keinen Kindprozess erzeugen.';
} elseif ($pid) {
/* Elternprozess */
socket_close($ary[0]);
if (socket_write($ary[1], $strone, strlen($strone)) === false) {
echo "socket_write() fehlgeschlagen. Grund: ".socket_strerror(socket_last_error($ary[1]));
}
if (socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
echo "Empfangen: $strtwo\n";
}
socket_close($ary[1]);
} else {
/* Kindprozess */
socket_close($ary[1]);
if (socket_write($ary[0], $strtwo, strlen($strtwo)) === false) {
echo "socket_write() fehlgeschlagen. Grund: ".socket_strerror(socket_last_error($ary[0]));
}
if (socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
echo "Empfangen: $strone\n";
}
socket_close($ary[0]);
}
?>
The underlying sockpair() function does only support AF_UNIX at least on BSD and Linux.
There is a syntax error in one of the code samples provided, it should look like this:
<?php
$sockets = array();
/* Setup socket pair */
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $sockets) === false) {
echo "socket_create_pair failed. Reason: ".socket_strerror(socket_last_error());
}
/* Send and Recieve Data */
if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) {
echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($sockets[0]));
}
if (($data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) {
echo "socket_read() failed. Reason: ".socket_strerror(socket_last_error($sockets[1]));
}
var_dump($data);
/* Close sockets */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>