/*
_________________________________________________________________________________________________
tcp-server.php v.0.1 build 0403
written by Heiko Barth :: 03/2008
www.heiko-barth.de
Copyright (c) 2008 Heiko Barth
This script is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
USING AT YOUR OWN RISK.
_________________________________________________________________________________________________
So if there's something you don't like, don't sit on the sidelines. Get involved and reform it.
Evolution works better than revolution, after all!
*/
// //
$interface = 0; // 0 = all interfaces, otherwise enter interface ip
$port = 5555; // listen port
$connections = 50; // max concurrent connetions
// //
set_time_limit(0);
ob_implicit_flush();
// check if socket extension is available
if (!function_exists('socket_create')) {
if(!(@dl("php_sockets.so") || @dl("php_sockets.dll"))) {
die("Error: Socket extension not available.\n");
}
}
// //
$sock = @socket_create(AF_INET, SOCK_STREAM, getprotobyname("TCP")) or
die("Error creating socket.\n");
@socket_bind($sock, $interface, $port) or
die("Error binding socket. Port $port is already in use!?\n");
@socket_listen($sock, $connections) or
die("Error while setting listen mode on socket.\n");
// //
$clients = array();
// monitor socks
do {
$updatesocks = array();
$updatesocks[] = $sock;
foreach($clients as $clientsock) {
$updatesocks[] = $clientsock;
}
// check wait for incoming connections
$sockschanged = socket_select($updatesocks, $writesocks, $errorsocks, 1);
if ($sockschanged > 0) {
foreach($updatesocks as $csock) {
if ($csock == $sock) {
// accept connection
if (count($clients) < $connections) {
$newsock = socket_accept($sock);
if ($newsock) {
$clients[] = $newsock;
client_connected($newsock);
}
}
}
else {
// call function to handle client data
$sockdata = @socket_read($csock, 512);
if (($sockdata !== false) && ($sockdata != "")) { // !== handles case character "0" was send
if ($sockdata != "") {
handle_client($sockdata);
}
else {
// closed socket!? --> recognized by tests with the apache benchmark utility while creating timeouts
remove_client();
}
}
else {
// on error: close socket and delete client from array
// echo socket_last_error($csock);
remove_client();
}
}
}
}
// shows connections at console title; win32 only
#$cmd = "title Connections: " . count($clients);
#`$cmd`;
} while (true);
// use this functin to handle client input
// $data contains the data send by the client
// use "socket_write($csock, $YOURDATA, strlen($YOURDATA));" to send data to the client
function client_connected($sock) {
socket_getpeername($sock, $ip);
echo $ip . " connected\n";
}
function handle_client($data) {
global $csock;
socket_getpeername($csock, $ip);
echo "[$ip] " . trim($data) . "\n";
if (@socket_write($csock, "ok\n") === false) {
remove_client();
}
}
$buffer = array();
function remove_client() {
echo "Client disconnected\n";
global $csock;
global $clients;
$arr = array_keys($clients, $csock);
unset($clients[$arr[0]]);
@socket_shutdown($csock);
@socket_close($csock);
}