<?php
class User
{
var $spawn;
var $nic = "";
var $inn = false;
function User($socket_spawn)
{
$this->spawn = $socket_spawn;
}
}
$users = array();
function checkForName($name)
{
global $users;
foreach($users as $user)
{
if(strtoupper($user->nic) == strtoupper($name))
{
return false;
}
}
return true;
}
function findUserFromSoc($soc)
{
global $users;
$i = 0;
foreach($users as $user)
{
if($user->spawn == $soc)
{
return $i;
}
$i++;
}
return false;
}
function handle_clients($socket, $buffer)
{
global $users;
foreach($users as $user)
{
$nic = $users[findUserFromSoc($socket)]->nic;
socket_write($user->spawn, "$nic wrote: $buffer\n\r");
}
}
function shut_down()
{
global $users, $socket;
foreach($users as $user)
{
socket_close($user->spawn);
}
socket_close($socket);
die();
}
//Timeout
set_time_limit(0);
//Create the socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket");
//Binding the socket to a port
$result = socket_bind($socket, "127.0.0.1", 1234) or die("Could not bind socket to port");
//Setting up a listener
$result = socket_listen($socket);
echo "Listener's up running\n\r";
while(true)
{
$changed_sockets = array($socket);
foreach($users as $user)
{
$changed_sockets[] = $user->spawn;
}
echo "Number off sockets: ".count($changed_sockets)."\n\r";
$num_changed_sockets = socket_select($changed_sockets, $write = NULL, $except = NULL, NULL);
foreach($changed_sockets as $soc) {
if ($soc == $socket) {
$client = socket_accept($socket) or die("Could not accept connection");
socket_write($client, "Welcom to my humble chat. In order to join you need to enter a username. What would you like as username?\n\r");
$user = new User($client);
array_push($users, $user);
} else {
$user = findUserFromSoc($soc);
if(!is_int($user))
{
die("Unknown error");
}
if($users[$user]->nic == "")
{
$bytes = socket_recv($soc, $buffer, 2048, 0);
if ($bytes == 0) {
$index = findUserFromSoc($soc);
if(is_int($index))
{
unset($users[$index]);
}
socket_close($soc);
}
else
{
if($buffer == "Q")
{
shut_down();
}
if(checkForName($buffer))
{
$users[$user]->nic = $buffer;
}
else
{
socket_write($soc, "Sorry, but the username ".$buffer." has already been taken. Pleas select another one.\n\rWhat would you like your username to be?\n\r");
}
}
}
else
{
$bytes = socket_recv($soc, $buffer, 2048, 0);
if ($bytes == 0) {
$index = findUserFromSoc($socket);
if(is_int($index))
{
unset($users[$index]);
}
socket_close($soc);
}
else
{
if($buffer == "Q")
{
shut_down();
}
echo "Received $buffer\n\r";
handle_clients($soc, $buffer);
}
}
}
}
}
?>Problem: Name and strings can only be one character long :S