The underlying sockpair() function does only support AF_UNIX at least on BSD and Linux.
socket_create_pair
(PHP 4 >= 4.1.0, PHP 5)
socket_create_pair — Erzeugt ein Paar nicht zu unterscheidender Sockets und speichert sie in einem Array
Beschreibung
$domain
, int $type
, int $protocol
, array &$fd
)
socket_create_pair() erzeugt zwei nicht
unterscheidbare, verbundene Sockets und speichert sie im Array
fd. Diese Funktion wird allgemein bei der
Inter-Prozess-Kommunikation (IPC) verwendet.
Parameter-Liste
-
domain -
Der Parameter
domainbestimmt die Protokollfamilie, die von den Sockets benutzt werden. Eine komplette Liste finden Sie bei der Funktion socket_create(). -
type -
Der Parameter
typebestimmt den Kommunikationstyp, den die Sockets verwenden sollen. Eine komplette Liste finden Sie bei der Funktion socket_create(). -
protocol -
Der Parameter
protocolsetzt das spezifische Protokoll innerhalb der angegebenendomain, das vom zurückgegebenen Socket für die Kommunikation benutzt wird. 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 KonstantenSOL_TCPoderSOL_UDPbenutzt werden.Eine vollständige Liste aller unterstützter Protokolle finden Sie bei der Funktion socket_create().
-
fd -
Referenz auf das Array, in das die beiden Socket-Deskriptoren eingefügt werden.
Rückgabewerte
Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.
Changelog
| Version | Beschreibung |
|---|---|
| 5.3.0 | Diese Funktion wurde für Windows-Plattformen wieder reaktiviert. |
| 4.3.0 | Diese Funktion wurde aufgrund eines Fehlers für Windows deaktiviert. |
Beispiele
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]);
}
?>
Siehe auch
- socket_create() - Erzeugt einen Socket (Endpunkt für die Kommunikation)
- socket_create_listen() - Öffnet einen Socket, um Verbindungen über einem gegebenen Port aufzubauen
- socket_bind() - Verknüpft einen Socket mit einem Namen
- socket_listen() - Hört einen Socket nach Verbindungsanforderungen ab
- socket_last_error() - Gibt den letzten Fehler zurück, der an einem Socket aufgetreten ist
- socket_strerror() - Gibt einen String zurück, der einen socket-Fehler beschreibt
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]);
?>
