FADE
Вот примитивный мультиюзерный сокет сервер, он умеет только отвечать, что сказал ему клиент, то есть echo-server:
PHP код:

<?
// don't timeout
set_time_limit(0);
define("IP","127.0.0.1");
define("PORT",11000);
$NULL=NULL;
$server=socket_create(AF_INET,SOCK_STREAM,0) or die(socket_strerror(socket_last_error()));
socket_bind($server,IP,PORT) or die(socket_strerror(socket_last_error()));
socket_listen($server) or die(socket_strerror(socket_last_error()));
$clients=array($server);
while(TRUE)
{
$read=$clients;
$num_changed_clients=socket_select($read,$NULL,$NULL,NULL);
if($num_changed_clients<1) continue;
if(in_array($server,$read))
{
$new_client=socket_accept($server);
$clients[]=$new_client;
echo "New Client ist here\n";
socket_write($new_client,"Hallo\n",strlen("Hallo\n"));
$key=array_search($server,$read);
unset($read[$key]);
}
foreach($read as $k=>$read_sock)
{
$msg=@socket_read($read_sock,512);
if($msg!==false) $msg=trim($msg);
//here your server commands
if($msg===false || $msg=="end")
{
$key=array_search($read_sock,$clients);
unset($clients[$key]);
echo "Client is gone away\n";
}
else
{
echo "client said: ".$msg."\n";
$msg="Server->".$msg."\n";
socket_write($read_sock,$msg,strlen($msg));
}
}
}
socket_close($server) or die(socket_strerror(socket_last_error()));
fputs(STDOUT,"\nAny button to close....");
?>
Все клиенты управляются в array-e $clients. При каждом пробеге while проверяется статус клиентов.
Сервер висит на 127.0.0.1 и в кчестве порта я выбрал 11000, хотя можно и другие.
А вот пример клиента для тестов:
PHP код:

<?
set_time_limit(0);
while(TRUE)
{
$command=fgets(STDIN,128);
$command=trim($command);
switch($command)
{
case "con":
case "connect":
fwrite(STDOUT,"Host: ");
$host=fgets(STDIN,128);
fwrite(STDOUT,"Port: ");
$port=fgets(STDIN,128);
$host=trim($host);
$port=trim($port);
$fp = fsockopen($host, $port, $errno, $errstr,10);
if (!$fp)
{
fwrite(STDOUT,"No connection\n");
}
else
{
$msg=fgets($fp, 128);
fwrite(STDOUT,$msg."\n");
$msg=fgets(STDIN,128);
$msg=trim($msg);
while ($msg!="end")
{
$out=$msg;
echo "Writing....\n";fwrite($fp, $out,strlen($out));
echo "Geting Answer....\n";$answer=fgets($fp, 128);
echo "Writing Answer.....";fwrite(STDOUT, $answer."\n");echo "....\n";
$msg=fgets(STDIN,128);
$msg=trim($msg);
}
fclose($fp);
}
break;
case "quit":
break 2;
default:
fwrite(STDOUT,$command);
break 2;
}
}
fwrite(STDOUT,"Bye-Bye");
?>
Войдя в клиент надо набрать connect, после этого клиент спрашивает какой IP и Порт у сервера, и если он удачно подключается, то получает сообщение от сервера "Hallo", далее можно писать всё что угодно, сервер будет всё возвращать назад. Комманда end клиента разрывает связь.
Сервер покаа конечно не стабилен, есть ошибки, но в целом уже рабочий и может работать с несколькими клиентами одновременно.
Чтобы организовать FTP, вам придётся точно выучить, как выглядит запрос-ответ тех комманд, которые вам нужно реализовать.
А также тестить-тестить-тестить
Запустить сервер и клиент можно нажав правой кнопкой на файле, далее "открыть с..." (или как там в русской Винде), далее найти php.exe и открыть, далее сервер или клиент появятся обычным cmd-окошком