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
Форумы портала PHP.SU :: Версия для печати :: Зависание скрипта с сокетом
Форумы портала PHP.SU » » Работа с сетью » Зависание скрипта с сокетом

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

1. prostodeniska - 14 Марта, 2016 - 20:01:44 - перейти к сообщению
Есть скрипт сокет-сервера, который должен принимать данные. При этом установлен неявный сброс вывода с помощью ob_implicit_flush. Если удалить весь код после строки socket_accept включительно, то скрип выполняется и вывод отображается, но при запуске всего скрипта вывод игнорируется и он просто зависает на строке socket_accept. Попытки подключиться к нему так же безуспешны. Пример используется на PHP 5.4-5.6. Как я понял на более ранних версиях он работает корректно, но сам не проверял.

PHP:
скопировать код в буфер обмена
  1.        
  2.         ob_implicit_flush();
  3.         set_time_limit(0);
  4.  
  5.         $address = '127.0.0.1';
  6.         $port = 8889;
  7.  
  8.         $sock = socket_create(AF_INET, SOCK_STREAM, 0);
  9.         echo 'Создание сокета';
  10.         if (!$sock) {
  11.                 echo 'Ошибка: '.socket_strerror(socket_last_error());
  12.                 exit();
  13.         } else {
  14.                 echo 'ОК';
  15.         }
  16.  
  17.         socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
  18.        
  19.         $bind = socket_bind($sock, $address, $port);
  20.         if (!$bind) {
  21.                 echo 'Ошибка: '.socket_strerror(socket_last_error());
  22.                 exit();
  23.         } else {
  24.                 echo 'OК';
  25.         }
  26.  
  27.         echo 'Прослушивание сокета... ';
  28.  
  29.         $listen = socket_listen($sock, 100);
  30.         if (!$listen) {
  31.                 echo 'Ошибка: '.socket_strerror(socket_last_error());
  32.                 exit();
  33.         } else {
  34.                 echo 'ОК';
  35.         }
  36.  
  37.         while (true) {
  38.                 echo 'Ожидание подключения... ';
  39.                
  40.                 $client = socket_accept($sock);
  41.                 socket_close($client);
  42.                 if ($client === false) {
  43.                         echo 'Ошибка: '.socket_strerror(socket_last_error());
  44.                         usleep(100);
  45.                 } else {
  46.                         echo 'ОК'.PHP_EOL;
  47.                         echo 'Соединение с клиентом "'.$client.'" установлено';
  48.                 }
  49.  
  50.                 socket_close($client);
  51.         }
  52.  
  53.         socket_close($sock);
  54.  

 

Powered by ExBB FM 1.0 RC1