Показать сообщение отдельно

  #6448  
Старый 24.11.2008, 03:44
imajo.ati
Участник форума
Регистрация: 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_INETSOCK_STREAMSOL_TCP), 1);
    if ( 
SERVER )                   _error();
    if ( 
socket_bind(SERVER ,$addr$port) < )       _error();
    if ( 
socket_listen(SERVER$max_connections) < _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 _error();


    
// когда клиент приконнектился, сервер отправляет приветствие клиенту

      
$connections++;
      
s_send($CLIENT,'Привет. die - выкл сервер. exit - разъединиться.');


      while(
true)  // цикл 2
      
{

        
$DATA socket_read($CLIENT1024);
        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_strerrorsocket_last_error() );
    if ( 
defined('SERVER') AND SERVER )
        
socket_close(SERVER);
    die;
}
//endfunc


function s_send($socket$msg)
{
    
socket_write($socket$msgstrlen($msg));
}
//endfunc

?>

Последний раз редактировалось imajo.ati; 24.11.2008 в 04:04..
 
Ответить с цитированием