Russian Ukraine English
Catalog RSS

LXIX. Socket functions

The socket extension implements a low-level interface to the socket communication functions, 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.

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.

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 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'.

<?php error_reporting (E_ALL);  /* Allow the script to hang around waiting for connections. */ set_time_limit (0);  $address = ''; $port = 10000;  if (($sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {     echo "socket() failed: reason: " . strerror ($sock) . "\n"; }  if (($ret = bind ($sock, $address, $port)) < 0) {     echo "bind() failed: reason: " . strerror ($ret) . "\n"; }  if (($ret = listen ($sock, 5)) < 0) {     echo "listen() failed: reason: " . strerror ($ret) . "\n"; }  do {     if (($msgsock = accept_connect($sock)) < 0) {         echo "accept_connect() failed: reason: " . strerror ($msgsock) . "\n";         break;     }     do {         $buf = '';         $ret = read ($msgsock, $buf, 2048);         if ($ret < 0) {             echo "read() failed: reason: " . strerror ($ret) . "\n";             break 2;         }         if ($ret == 0) {             break 2;         }         $buf = trim ($buf);         if ($buf == 'quit') {             close ($msgsock);             break 2;         }         $talkback = "PHP: You said '$buf'.\n";         write ($msgsock, $talkback, strlen ($talkback));         echo "$buf\n";     } while (true);     close ($msgsock); } while (true);  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 ('');  /* Create a TCP/IP socket. */ $socket = socket (AF_INET, SOCK_STREAM, 0); if ($socket < 0) {     echo "socket() failed: reason: " . strerror ($socket) . "\n"; } else {     "socket() successful: " . strerror ($socket) . "\n"; }  echo "Attempting to connect to '$address' on port '$service_port'..."; $result = connect ($socket, $address, $service_port); if ($result < 0) {     echo "connect() failed.\nReason: ($result) " . strerror($result) . "\n"; } else {     echo "OK.\n"; }  $in = "HEAD / HTTP/1.0\r\n\r\n"; $out = '';  echo "Sending HTTP HEAD request..."; write ($socket, $in, strlen ($in)); echo "OK.\n";  echo "Reading response:\n\n"; while (read ($socket, $out, 2048)) {     echo $out; }  echo "Closing socket..."; close ($socket); echo "OK.\n\n"; ?>       

Table of Contents
accept_connect — Accepts a connection on a socket
bind — Binds a name to a socket
close — Closes a file descriptor
connect — Initiates a connection on a socket
listen — Listens for a connection on a socket
read — Read from a socket
socket — Create a socket (endpoint for communication)
strerror — Return a string describing a socket error
write — Write to a socket