XCVI. Socket Funktionen

Warnung

Diese Erweiterung ist EXPERIMENTELL. Das Verhalten dieser Erweiterung, einschließlich der Funktionsnamen, und alles Andere was hier dokumentiert ist, kann sich in zukünftigen PHP-Versionen ohne Ankündigung ändern. Seien Sie gewarnt und verwenden Sie diese Erweiterung auf eigenes Risiko.

Die Socket-Erweiterung stellt eine hardwarenahe Schnittstelle zu den Datenaustauschfunktionen einer Socket-Verbindung zur Verfügung und bietet die Möglichkeit, entweder als Socket-Server oder als Client zu agieren.

Die hier beschriebenen Socket Funktionen sind Teil einer PHP Erweiterung, die beim Kompilieren mit der Option--enable-sockets beim Befehl configure eingebunden werden müssen.

Für eine allgemeinere clientseitige Socket Schnittstelle siehe fsockopen() und pfsockopen().

Wenn man diese Funktionen benutzt, darf man nicht vergessen, dass, obwohl viele der Funktionen gleichlautende Namen wie ihre Entsprechungen in C haben, sie dennoch oft unterschiedliche Deklarationen haben. Bitte lesen Sie die Deklarationen, um Verwirrung zu vermeiden.

Das heisst, wem Socketprogrammierung fremd ist, der findet eine grosse Menge nützlicher Materialien in den entsprechenden Unix manpages und es gibt jede Menge von Tutorials und Informationen über Socketprogrammierung in C im Internet. Vieles davon kann mit leichten Änderungen für die Socketprogrammierung mit PHP benutzt werden.

Beispiel 1. Socket Beispiel: Einfacher TCP/IP Server

Dieses Beispiel zeigt einen einfachen Echo-Server. Passen Sie die Variablen address und port an Ihre Systemumgebung an und führen Sie das Skript aus. Dann können Sie sich mit einem Befehl wie: telnet 192.168.1.53 10000 (bei dem adress und port an Ihre Umgebung angepasst ist) mit dem Server verbinden. Alles, was Sie eingeben, wird an den Server geschickt und von diesem wieder an Sie zurückgegeben. Um die Verbindung zu trennen, geben sie 'quit' ein.

<?php
error_reporting (E_ALL);

/* Warten auf Verbindungen */
set_time_limit (0);

$address = '192.168.1.53';
$port = 10000;

if (($sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
    echo "socket() fehlgeschlagen: Grund: " . strerror ($sock) . "\n";
}

if (($ret = bind ($sock, $address, $port)) < 0) {
    echo "bind() fehlgeschlagen: Grund: " . strerror ($ret) . "\n";
}

if (($ret = listen ($sock, 5)) < 0) {
    echo "listen() fehlgeschlagen: Grund: " . strerror ($ret) . "\n";
}

do {
    if (($msgsock = accept_connect($sock)) < 0) {
        echo "accept_connect() fehlgeschlagen: Grund: " . strerror ($msgsock) . "\n";
        break;
    }
    do {
        $buf = '';
        $ret = read ($msgsock, $buf, 2048);
        if ($ret < 0) {
            echo "read() fehlgeschlagen: Grund: " . strerror ($ret) . "\n";
            break 2;
        }
        if ($ret == 0) {
            break 2;
        }
        $buf = trim ($buf);
        if ($buf == 'quit') {
            close ($msgsock);
            break 2;
        }
        $talkback = "PHP: Du sagtest '$buf'.\n";
        write ($msgsock, $talkback, strlen ($talkback));
        echo "$buf\n";
    } while (true);
    close ($msgsock);
} while (true);

close ($sock);
?>

Beispiel 2. Socket Beispiel: Einfacher TCP/IP Client

Dieses Beispiel zeigt einen einfachen HTTP-Client. Er verbindet sich mit einer Seite, schickt einen HEAD-Request, gibt die Antwort zurueck und beendet das Skript.

<?php
error_reporting (E_ALL);

echo "<h2>TCP/IP Verbindung</h2>\n";

/* Die Portnummer des WWW Service holen. */
$service_port = getservbyname ('www', 'tcp');

/* Die IP-Adresse des Zielhosts holen. */
$address = gethostbyname ('www.example.com');

/* Eine TCP/IP Socketverbindung aufbauen. */
$socket = socket (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
    echo "socket() fehlgeschlagen: Grund: " . strerror ($socket) . "\n";
} else {
    "socket() ausgefuehrt: " . strerror ($socket) . "\n";
}

echo "Verbindungsversuch mit '$address' on port '$service_port'...";
$result = connect ($socket, $address, $service_port);
if ($result < 0) {
    echo "connect() fehlgeschlagen.\nGrund: ($result) " . strerror($result) . "\n";
} else {
    echo "OK.\n";
}

$in = "HEAD / HTTP/1.0\r\n\r\n";
$out = '';

echo "HTTP HEAD request senden...";
write ($socket, $in, strlen ($in));
echo "OK.\n";

echo "Antwort lesen:\n\n";
while (read ($socket, $out, 2048)) {
    echo $out;
}

echo "Socketverbindung schliessen...";
close ($socket);
echo "OK.\n\n";
?>

Inhaltsverzeichnis
socket_accept -- Accepts a connection on a socket
socket_bind -- Binds a name to a socket
socket_clear_error -- Clears the error on the socket or the last error code
socket_close -- Closes a socket resource
socket_connect -- Initiates a connection on a socket
socket_create_listen -- Opens a socket on port to accept connections
socket_create_pair -- Creates a pair of indistinguishable sockets and stores them in fds.
socket_create -- Create a socket (endpoint for communication)
socket_get_option -- Gets socket options for the socket
socket_getpeername --  Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type.
socket_getsockname --  Queries the local side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type.
socket_iovec_add -- Adds a new vector to the scatter/gather array
socket_iovec_alloc -- ...]) Builds a 'struct iovec' for use with sendmsg, recvmsg, writev, and readv
socket_iovec_delete -- Deletes a vector from an array of vectors
socket_iovec_fetch -- Returns the data held in the iovec specified by iovec_id[iovec_position]
socket_iovec_free -- Frees the iovec specified by iovec_id
socket_iovec_set -- Sets the data held in iovec_id[iovec_position] to new_val
socket_last_error -- Returns the last error on the socket
socket_listen -- Listens for a connection on a socket
socket_read -- Reads a maximum of length bytes from a socket
socket_readv -- Reads from an fd, using the scatter-gather array defined by iovec_id
socket_recv -- Receives data from a connected socket
socket_recvfrom -- Receives data from a socket, connected or not
socket_recvmsg -- Used to receive messages on a socket, whether connection-oriented or not
socket_select -- Runs the select() system call on the given arrays of sockets with a timeout specified by tv_sec and tv_usec
socket_send -- Sends data to a connected socket
socket_sendmsg -- Sends a message to a socket, regardless of whether it is connection-oriented or not
socket_sendto -- Sends a message to a socket, whether it is connected or not
socket_set_nonblock -- Sets nonblocking mode for file descriptor fd
socket_set_option -- Sets socket options for the socket
socket_shutdown -- Shuts down a socket for receiving, sending, or both.
socket_strerror -- Return a string describing a socket error
socket_write -- Write to a socket
socket_writev -- Writes to a file descriptor, fd, using the scatter-gather array defined by iovec_id