Зависают сокеты

WAS71

Новичок
Зависают сокеты

Добрый денек всем !!
никак не пойму в чем проблема, запускаю скрипт, который создает сокет на 5 подключений, при конекте на первый - все работает, запрос принимается и отсылается, если сделать еще одно(2-3-4) подключения - конектится, но ответа нет - помогает только полная остановка/запуск сервера (appache).
что не так делаю, вот исходник

PHP:
#!/usr/local/bin/php -q
<?php
error_reporting (E_ALL);

/* Разрешить скрипту зависнуть в ожидании соединений. */
set_time_limit (0);

/* Включить неявную очистку вывода, и мы увидим всё получаемое
 * по мере поступления. */
ob_implicit_flush ();

$address = 'localhost';
$port = 10000;

if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
    echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
}

if (($ret = socket_bind ($sock, $address, $port)) < 0) {
    echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
}

if (($ret = socket_listen ($sock, 5)) < 0) {
    echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
        break;
    }

    do {
        if (FALSE === ($buf = socket_read ($msgsock, 2048))) {
            echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
            break 2;
        }
        if (!$buf = trim ($buf)) {
            continue;
        }

        if ($buf)
         {
          $msg = 'Rec_OK'.chr(13).chr(10);    // обязательно 0А
          socket_write($msgsock, $msg, strlen($msg));
          continue;
         }

    } while (true);
    socket_close ($msgsock);
} while (true);

socket_close ($sock);

?>
 

WAS71

Новичок
как его еще форматировать, там же кода 5 строчек, прям из примеров
 

whirlwind

TDD infected, paranoid
ты про do/while читал или так от балды набрал? Нука расскажи нам что должен делать этот код

PHP:
do { 
        if (FALSE === ($buf = socket_read ($msgsock, 2048))) { 
            echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n"; 
            break 2; 
        } 
        if (!$buf = trim ($buf)) { 
            continue; 
        } 

        if ($buf) 
         { 
          $msg = 'Rec_OK'.chr(13).chr(10);    // обязательно 0А 
          socket_write($msgsock, $msg, strlen($msg)); 
          continue; 
         } 

    } while (true);
 

WAS71

Новичок
в цикле ждем ответ от сокета, если в буфере что то появилось - отвечаем клиенту Rec_OK

и причем тут do/while

цикл вечный, что тут не понятно ?
в конечном тексте будет выход из него когда надо будет закрыть сесеию

счас вопрос то другой, одна сесия работает нормально - т.е. отвечает Rec_OK
а следующие не отвечают, хотя и создаются
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а почему в разделе Pear/Pecl ?
поддержка сокетов в ядре, наск я помню
 

WAS71

Новичок
/а почему в разделе Pear/Pecl ?/ - это я не понял

ядро чего ОС, WEB-Сервера - ???

-~{}~ 28.05.09 12:13:

я так понял никто не хочет помочь моему горю
 

vegaplex

Новичок
на каком имено этапе они "зависают" ?
почитай про неблокируемые сокеты, хотя, при НС-е всё-равно он будет висеть.
 

WAS71

Новичок
зависают они я так понял, в момент создания сесии, т.е. как бы сервер просто не отвечает, хотя на сервере вижу что сесия создалась
и это происходит со 2й далее сесией
1я работает нормально
 

ys

отодвинутый новичок
Для начала, меняем:
if (($msgsock = socket_accept($sock)) < 0) {
на
if (FALSE === ($msgsock = socket_accept($sock)) ) {

-~{}~ 28.05.09 18:23:

Да и что значит:

if ($buf)

?

-~{}~ 28.05.09 18:32:

И PHP_NORMAL_READ нужен в socket_read()
 
Сверху