
24.11.2008, 03:44
|
|
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме: 975514
Репутация:
177
|
|
здравствуйте! не могу разобраться с реализацией серверного приложения на php
вот код, немного модифицированный пример из интернета.
проблема в том что серверу необходимо разорвать текущее соединение с клиентом для открытия нового.
тут при соединении с клиентом запускается бесконечный цикл(2). если запускать функцию catch_client() из цикла(2), получится, что сервер зависнет при ожидании нового подключения и перестанет обрабатывать текущее.
нужно, чтобы он не переставая обрабатывать текущее, встал на ожидание нового подключения.
PHP код:
<?php
ignore_user_abort();
set_time_limit(0);
$addr = 'localhost';
$port = 12345;
$connections = 0;
$max_connections = 20;
define('SERVER', socket_create(AF_INET, SOCK_STREAM, SOL_TCP), 1);
if ( SERVER < 0 ) _error();
if ( socket_bind(SERVER ,$addr, $port) < 0 ) _error();
if ( socket_listen(SERVER, $max_connections) < 0 ) _error();
catch_client();
function catch_client()
{
GLOBAL $connections;
GLOBAL $max_connections;
if ( $connections >= $max_connections ) return;
while(true) // цикл 1
{
// тут пхп возвращает управление операционной системе и ждёт подключения
$CLIENT = socket_accept(SERVER); if ( $CLIENT < 0 ) _error();
// когда клиент приконнектился, сервер отправляет приветствие клиенту
$connections++;
s_send($CLIENT,'Привет. die - выкл сервер. exit - разъединиться.');
while(true) // цикл 2
{
$DATA = socket_read($CLIENT, 1024);
if ( $DATA === FALSE ) _error();
if ( $DATA == 'exit' )
{
socket_close($CLIENT);
$connections--;
break 2; // разрывает соединение с клиентом
}
elseif ( $DATA == 'die' )
{
socket_close($CLIENT);
socket_close(SERVER);
break 1; // выключает сервер
}
else
{
s_send($CLIENT, $DATA); // отсылает обратно текст
}
} //endwhile 2
} //endwhile 1
}//endfunc
function _error()
{
echo socket_strerror( socket_last_error() );
if ( defined('SERVER') AND SERVER > 0 )
socket_close(SERVER);
die;
}
//endfunc
function s_send($socket, $msg)
{
socket_write($socket, $msg, strlen($msg));
}
//endfunc
?>
Последний раз редактировалось imajo.ati; 24.11.2008 в 04:04..
|
|
|