Socket Programming with PHP
Open a socket, print a message, close one pipe, and read the response.
$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($socket,$host,$port);
$originalMessageLength = strlen($message);
$message = 'REPORT SPAMC/1.2' . chr(13) . chr(10) . 'Content-length: ' . $originalMessageLength . chr(13) . chr(10) . chr(13) . chr(10) . $message;
$status = socket_sendto($socket,$message, strlen($message), MSG_EOF, $host, $port);
if ($status == -1)
{
$error = socket_strerror(socket_last_error());
throw new Exception(__FUNCTION__ .' - Unable to connect to spamd on '. $host . ':' . $port . '. The error message: ' . $error);
}
$message = '';
while ($status = socket_read($socket,4096))
{
$message .= $status;
}
Simple server
<?
$host = "192.168.1.99";
$port = 1234;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
// accept incoming connections and spawn another socket to handle communication
while(true)
{
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
$input = socket_read($spawn, 1024) or die("Could not read input\n");
$input = trim($input);
// reverse client input and send back
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
socket_close($spawn);
}
socket_close($socket);
?>
Note: we must run the program with -q which tells PHP to suppress the "Content-Type: text/html" header.
Sample client using fsockopen
$host="192.168.1.99";
$port = 1234;
// open a client connection
$fp = fsockopen ($host, $port, $errno, $errstr);
if (!$fp)
{
$result = "Error: could not open socket connection";
}
else
{
fgets ($fp, 1024);
fputs ($fp, $message);
$result .= fgets ($fp, 1024);
fclose ($fp);
}
Sample client
$host="192.168.1.99";
$port = 1234;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create
socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect
to server\n");
socket_read ($socket, 1024) or die("Could not read server response\n");
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send
data to server\n");
// get server response
$result = socket_read ($socket, 1024) or die("Could not read server
response\n");
// end session
socket_write($socket, "END", 3) or die("Could not end session\n");
// close socket
socket_close($socket);
// clean up result
$result = trim($result);
$result = substr($result, 0, strlen($result)-1);
page revision: 4, last edited: 02 Oct 2008 21:43