Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сокеты Сокеты и Сокеты!

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Давит
Отправлено: 03 Апреля, 2012 - 22:01:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2011  


Помог: 2 раз(а)




Здравствуйте,
Есть несколько вопросов по поводу socket

Есть Клиент-сервер файли

server
Спойлер (Отобразить)


Запускаю файл сервер, потом несколько раз запускаю клиент,
создается несколько сокетное соединение,

Теперь вопросы, вопросы много но я напишу первый 2

1) как с php, узнать сколько сокетное соединения есть?
2) Есть например 4 соединения, как закраивать например последние 2 соединения

Спасибо

(Отредактировано автором: 03 Апреля, 2012 - 22:13:29)

 
 Top
Давит
Отправлено: 04 Апреля, 2012 - 11:39:23
Post Id



Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2011  


Помог: 2 раз(а)




кто может помочь?
 
 Top
EuGen Администратор
Отправлено: 04 Апреля, 2012 - 12:21:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Давит
Приведу пример. Скрипт принимает параметры хост, порт и максимально разрешенное число клиентов. Если соединяется новый клиент, сервер будет разрывать соединения с тем, чтобы число клиентов не превышало допустимого:
PHP:
скопировать код в буфер обмена
  1. // Set the ip and port we will listen on
  2. $sAddress       = $_SERVER['argv'][1];
  3. $iPort          = (int)$_SERVER['argv'][2];
  4. $iMaxClients    = (int)$_SERVER['argv'][3];
  5.  
  6. $rgClients  = array();
  7. $rgRead     = array();
  8. // Create a TCP Stream socket
  9. $rSock = socket_create(AF_INET, SOCK_STREAM, 0);
  10. socket_bind($rSock, $sAddress, $iPort) or exit('Could not bind to address');
  11. socket_listen($rSock);
  12.  
  13. while(1)
  14. {
  15.     // Setup clients listen socket for reading
  16.     $rgRead[0] = $rSock;
  17.     for ($i=0; $i<$iMaxClients; $i++)
  18.     {
  19.         if ($rgClients[$i]['sock']  != null)
  20.         {
  21.             $rgRead[$i+1] = $rgClients[$i]['sock'];
  22.         }
  23.     }
  24.     // Set up a blocking call to socket_select()
  25.     $iReady = socket_select($rgRead, $mWrite=null, $mExcept=null, $mSec=null);
  26.     /* if a new connection is being made add it to the client array */
  27.     if(in_array($rSock, $rgRead))
  28.     {
  29.         for ($i=0; $i<$iMaxClients; $i++)
  30.         {
  31.             if ($rgClients[$i]['sock'] == null)
  32.             {
  33.                 $rgClients[$i]['sock'] = socket_accept($rSock);
  34.                 break;
  35.             }
  36.             elseif($i ==$iMaxClients-1)
  37.             {
  38.                 echo("Too many clients");
  39.                 unset($rgClients[$i]);
  40.             }
  41.         }
  42.         if (--$iReady <= 0)
  43.         {
  44.             continue;
  45.         }
  46.     }
  47.  
  48.     // If a client is trying to write - handle it now
  49.     for ($i=0; $i<$iMaxClients; $i++)
  50.     {
  51.         if (in_array($rgClients[$i]['sock'] , $rgRead))
  52.         {
  53.             $sInput = socket_read($rgClients[$i]['sock'] , 1024);
  54.             if($sInput == null)
  55.             {
  56.                 // 0-sized meaning disconnected
  57.                 unset($rgClients[$i]);
  58.             }
  59.             if($sInput)
  60.             {
  61.                 //just "echo" user string back to him:
  62.                 $sOutput = preg_replace("/[\t\n\r]/","",$sInput).chr(0);
  63.                 socket_write($rgClients[$i]['sock'], $sOutput);
  64.             }
  65.         }
  66.         else
  67.         {
  68.             //close the socket
  69.             unset($rgClients[$i]);
  70.         }
  71.     }
  72. }
  73. socket_close($rSock);


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Давит
Отправлено: 04 Апреля, 2012 - 23:54:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2011  


Помог: 2 раз(а)




EuGen Спасибо большое, код сложный, но кажется понял смысла

Каждый раз когда появляется новый клиент нумеруем в масиве,
потом кого нужно можем удалить так?,

в чем разница? между
и
PHP:
скопировать код в буфер обмена
  1. $rSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 
 Top
OrmaJever Модератор
Отправлено: 05 Апреля, 2012 - 00:36:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Давит пишет:
в чем разница? между

Константа SOL_TCP имеет значение 0, а SOL_UDP наверно 1. Проверьте.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
EuGen Администратор
Отправлено: 05 Апреля, 2012 - 09:30:25
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. $rgKeys = array();
  2. $sKey   = 'SOL_';
  3. array_walk(get_defined_constants(), function($mValue, $mKey) use (&$rgKeys, $sKey)
  4. {
  5.    if(preg_match('/^'.$sKey.'*/i', $mKey))
  6.    {
  7.       $rgKeys[$mKey]=$mValue;
  8.    }
  9. });
  10. var_dump($rgKeys);

>
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(3) {
  2.   ["SOL_SOCKET"]=>
  3.   int(1)
  4.   ["SOL_TCP"]=>
  5.   int(6)
  6.   ["SOL_UDP"]=>
  7.   int(17)
  8. }


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB