За последние 24 часа нас посетили 20512 программистов и 1117 роботов. Сейчас ищут 775 программистов ...

Как повторно отправлять запросы и принимать по TCP?

Тема в разделе "PHP для новичков", создана пользователем IlayVanse, 28 фев 2021.

Метки:
  1. IlayVanse

    IlayVanse Новичок

    С нами с:
    25 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    Здравствуйте! Помогите, пожалуйста. Нашел пример клиента TCP:
    PHP:
    1. <?php
    2.  
    3. echo "<h2>Соединение TCP/IP</h2>\n";
    4.  
    5. /* Получаем порт сервиса WWW. */
    6. $service_port = 1234;
    7.  
    8. /* Получаем IP-адрес целевого хоста. */
    9. $address = '0.0.0.0';
    10.  
    11. /* Создаём сокет TCP/IP. */
    12. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    13. if ($socket === false) {
    14.     echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
    15. } else {
    16.     echo "OK.\n";
    17. }
    18.  
    19. echo "Пытаемся соединиться с '$address' на порту '$service_port'...";
    20. $result = socket_connect($socket, $address, $service_port);
    21. if ($result === false) {
    22.     echo "Не удалось выполнить socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
    23. } else {
    24.     echo "OK.\n";
    25. }
    26.  
    27. $in = "help\r\n";
    28. $out = '';
    29.  
    30. echo "Отправляем HTTP-запрос HEAD...";
    31. socket_write($socket, $in);
    32. echo "OK.\n";
    33.  
    34. echo "Читаем ответ:\n\n";
    35. while ($out = socket_read($socket, 2048)) {
    36.     echo $out;
    37. }
    38.  
    39. echo "Закрываем сокет...";
    40. socket_close($socket);
    41. echo "OK.\n\n";
    42. ?>
    Когда мне надо повторно отправить запрос и получить сразу же от сервера ответ, то ничего не приходит. Могу только первый раз отправить и получить.
    Пример как я это пытаюсь сделать:
    PHP:
    1. $in = "help\r\n";
    2. $out = '';
    3.  
    4. echo "Отправляем HTTP-запрос HEAD...";
    5. socket_write($socket, $in);
    6. echo "OK.\n";
    7.  
    8. echo "Читаем ответ:\n\n";
    9. while ($out = socket_read($socket, 2048)) {
    10.     echo $out;
    11. }
    12.  
    13. $in = "help\r\n";
    14.  
    15. echo "Отправляем HTTP-запрос HEAD...";
    16. socket_write($socket, $in);
    17. echo "OK.\n";
    18.  
    19. echo "Читаем ответ:\n\n";
    20. while ($out = socket_read($socket, 2048)) {
    21.     echo $out;
    22. }
    В чем моя ошибка, как мне не один раз получать/отправлять на сервер?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    может закрывать стоит сокеты и открывать заново после каждой отправки запроса и получения ответа?
     
  3. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Гм, 5 секунд гугления говорят, как обслуживать сокеты: https://www.php.net/manual/ru/sockets.examples.php
    Вы забыли про петлю. После выполнения кода он просто завершается.
     
  4. IlayVanse

    IlayVanse Новичок

    С нами с:
    25 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    При каждом новом подключении, сервер создает как бы новую сессию. Вариант "каждый раз с новым сокетом" невозможен.
    --- Добавлено ---
    Можете, пожалуйста, уточнить про "петлю"?
     
  5. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Я про цикл. В Вашем коде выполнение происходит один раз и сокет закрывается. Вам же нужно сокет держать и проверять, есть ли новые данные.