XCV. Socket functions
| Warning | 
| This extension is
EXPERIMENTAL. The behaviour of this extension,
including the names of its functions, and anything else documented
about this extension may change in a future release of PHP without
notice.  Be warned and use this extension at your own
risk. | 
    The socket extension implements a low-level interface to the socket
    communication functions based on the popular BSD sockets, providing the
    possibility to act as a socket server as well as a client.
   
    The socket functions described here are part of an extension to
    PHP which must be enabled at compile time by giving the --enable-sockets option to
    configure.
   
    For a more generic client-side socket interface, see
    fsockopen() and
    pfsockopen().
   
    When using these functions, it is important to remember that while
    many of them have identical names to their C counterparts, they
    often have different declarations. Please be sure to read the
    descriptions to avoid confusion.
   
    The socket extension was written to provide a useable interface to the
    powerful BSD sockets. Care has been taken that the functions work equally
    well on Win32 and Unix implementations. Almost all of the sockets
    functions may fail under certain conditions and therefore emit an
    E_WARNING message describing the error. Sometimes this
    doesn't happen to the desire of the developer. For example the function
    socket_read() may suddenly emit an
    E_WARNING message because the connection broke
    unexpectedly. It's common to suppress the warning with the
    @-operator and catch the error code within the
    application with the socket_last_error() function. You
    may call the socket_strerror() function with this error
    code to retrieve a string describing the error. See their description for
    more information.
   
Note: 
     The E_WARNING messages generated by the socket
     extension are in english though the retrieved error message will appear
     depending on the current locale (LC_MESSAGES):
     
| Warning - socket_bind() unable to bind address [98]: Die Adresse wird bereits verwendet | 
    
    That said, those unfamiliar with socket programming can still find a lot
    of useful material in the appropriate Unix man pages, and there is a great
    deal of tutorial information on socket programming in C on the web, much
    of which can be applied, with slight modifications, to socket programming
    in PHP. The UNIX Socket
    FAQ might be a good start.
   
    
| Example 1. Socket example: Simple TCP/IP server 
      This example shows a simple talkback server. Change the
      address and port variables
      to suit your setup and execute. You may then connect to the
      server with a command similar to: telnet 192.168.1.53
      10000 (where the address and port match your
      setup). Anything you type will then be output on the server
      side, and echoed back to you. To disconnect, enter 'quit'.
      | #!/usr/local/bin/php -q
<?php
error_reporting (E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit (0);
/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush ();
$address = '192.168.1.53';
$port = 10000;
if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
    echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
}
if (($ret = socket_bind ($sock, $address, $port)) < 0) {
    echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
}
if (($ret = socket_listen ($sock, 5)) < 0) {
    echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
}
do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));
    do {
        if (FALSE === ($buf = socket_read ($msgsock, 2048))) {
            echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
            break 2;
        }
        if (!$buf = trim ($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close ($msgsock);
            break 2;
        }
        $talkback = "PHP: You said '$buf'.\n";
        socket_write ($msgsock, $talkback, strlen ($talkback));
        echo "$buf\n";
    } while (true);
    socket_close ($msgsock);
} while (true);
socket_close ($sock);
?> | 
 | 
   
    
| Example 2. Socket example: Simple TCP/IP client 
      This example shows a simple, one-shot HTTP client. It simply
      connects to a page, submits a HEAD request, echoes the reply,
      and exits.
      | <?php
error_reporting (E_ALL);
echo "<h2>TCP/IP Connection</h2>\n";
/* Get the port for the WWW service. */
$service_port = getservbyname ('www', 'tcp');
/* Get the IP address for the target host. */
$address = gethostbyname ('www.example.com');
/* Create a TCP/IP socket. */
$socket = socket_create (AF_INET, SOCK_STREAM, 0);
if ($socket < 0) {
    echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";
} else {
    echo "OK.\n";
}
echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect ($socket, $address, $service_port);
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
    echo "OK.\n";
}
$in = "HEAD / HTTP/1.0\r\n\r\n";
$out = '';
echo "Sending HTTP HEAD request...";
socket_write ($socket, $in, strlen ($in));
echo "OK.\n";
echo "Reading response:\n\n";
while ($out = socket_read ($socket, 2048)) {
    echo $out;
}
echo "Closing socket...";
socket_close ($socket);
echo "OK.\n\n";
?> | 
 | 
    - Table of Contents
- 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 -- Create a socket (endpoint for communication)
- 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_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 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