За последние 24 часа нас посетили 18587 программистов и 1600 роботов. Сейчас ищет 971 программист ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем YWAS, 26 май 2009.

  1. YWAS

    YWAS Активный пользователь

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



    ?>
    PHP:
    1.  
    2. #!/usr/local/bin/php -q
    3. <?php
    4.  
    5. /* Разрешить скрипту зависнуть в ожидании соединений. */
    6.  
    7. /* Включить неявную очистку вывода, и мы увидим всё получаемое
    8.  * по мере поступления. */
    9.  
    10. $address = 'localhost';
    11. $port = 10000;
    12.  
    13. if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
    14.     echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
    15. }
    16.  
    17. if (($ret = socket_bind ($sock, $address, $port)) < 0) {
    18.     echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
    19. }
    20.  
    21. if (($ret = socket_listen ($sock, 5)) < 0) {
    22.     echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
    23. }
    24.  
    25. do {
    26.     if (($msgsock = socket_accept($sock)) < 0) {
    27.         echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
    28.         break;
    29.     }
    30.  
    31.     do {
    32.         if (FALSE === ($buf = socket_read ($msgsock, 2048))) {
    33.             echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
    34.             break 2;
    35.         }
    36.         if (!$buf = trim ($buf)) {
    37.             continue;
    38.         }
    39.  
    40.         if ($buf)
    41.          {
    42.           $msg = 'Rec_OK'.chr(13).chr(10);    // обязательно 0А
    43.           socket_write($msgsock, $msg, strlen($msg));
    44.           continue;
    45.          }
    46.  
    47.     } while (true);
    48.     socket_close ($msgsock);
    49. } while (true);
    50.  
    51. socket_close ($sock);
    52.  
    53.  
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    socket_set_nonblock()
    socket_set_block()

    Это вас спасет.
     
  3. YWAS

    YWAS Активный пользователь

    С нами с:
    26 май 2009
    Сообщения:
    2
    Симпатии:
    0
    читал читал,
    так и не понял как применить сюда socket_set_nonblock() / socket_set_block()

    неужели только я столкнулся с этой проблемой
    и вообще зачем такие сокеты - которые не отвечают