TCP-клиент readStringUntil только при наличии данных

У меня есть прикрепленный скрипт, который считывает данные с сокет-сервера (это PHP на стороне сервера).

Моя проблема (я думаю) заключается в том, что readStringUntil() нуждается в тестировании над ним, чтобы он "считывал до \ r" только в том случае, если получены какие-либо данные, в противном случае он, похоже, продолжает пытаться читать вечно, потому что, когда я отправляю данные, они принимаются за 1-2 секунды задержка.

Если я постоянно отправляю (с правильными разделителями \ r) данные без какой-либо паузы, то, похоже, они принимаются мгновенно (10-20 мс или около того).

Я попробовал: if (client.available()) { String received_message = client.readStringUntil('\r'); } но, похоже, это неправильная функция, ничего не делает.

Это плата ESP32, компилятор упомянул, что он нашел две библиотеки wifi, одну в папке arduino и одну в ESP32, она использовала вторую. Это может иметь отношение к тому, какие функции доступны.

#include <WiFi.h>

const char* ssid = "MyWiFi";
const char* password =  "1234";

const uint16_t port = 8080;
const char * host = "myserver.example.com";

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("...");
  }

  Serial.print("wifi connected with IP: ");
  Serial.println(WiFi.localIP());
}


void loop() {

  WiFiClient client;

  if (!client.connect(host, port)) {
    Serial.println("connection to host failed");
    delay(500);
    return;
  }

  Serial.println("connected to server");

  // Я предполагаю, что именно здесь мне нужен тест типа "существуют ли какие-либо полученные данные" >>>

  String received_message = client.readStringUntil('\r');
  Serial.println(received_message);
  

  // преднамеренная задержка, похоже, мало что дает 
  // когда он постоянно пытается прочитать данные, которые не всегда есть
  delay(100);

  // нужно ли мне отключаться здесь ?!
  // клиент.стоп();
}

ОТРЕДАКТИРОВАНО: мой цикл PHP выглядит следующим образом:

do{
    $accept = socket_accept($socket) or die("Could not accept incomming connection");

    // $message_to_send = 'hi there '.microtime(true)."\r";
    // ИЛИ 
    // получить сообщение из переменных memcached
    
    if($message_to_send!=''){
        
        echo "\nsending: ".$message_to_send;
    
        socket_send($accept, $message_to_send, strlen($message_to_send), MSG_OOB);
    }
    
} while (true);

, 👍1

Обсуждение

библиотеки esp WiFi закрывают соединение, когда уничтожается последний объект WiFiClient, который ссылался на него. итак, здесь, в конце цикла()., @Juraj

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

Вы имеете в виду, что это происходит, когда он закрывает его автоматически или когда мне нужно вызвать закрытие? Спасибо., @adrianTNT

Сервер немедленно отправляет данные, если я ему прикажу, он находится внутри бесконечного цикла, где я заставляю его проверять наличие новых данных и отправлять их, если они найдены. Задержка появляется, когда он зацикливается, не имея данных для отправки, а затем начинает что-то отправлять., @adrianTNT

Если цикл постоянно отправляет данные с правильными разделителями в каждом цикле (например, `привет".microtime (true)."\ r")", то задержки нет., @adrianTNT

ваш клиент подключается и отключается в каждом цикле (). сделайте WiFiClient глобальным, подключайте его обратно только тогда, когда он отключается. и тогда будет работать if (client.available()), @Juraj

Вы имеете в виду, что "client.connect" в верхней части цикла вызывает задержку? Я не думаю, что это потому, что если я закомментирую client.readStringUntil(), то цикл будет намного быстрее., @adrianTNT

Должен ли я переместить WiFiClient прямо над loop(){}, чтобы сделать его глобальным? И я не знаю, как подключить его обратно, когда он отключится :/, @adrianTNT

client.readStringUntil() секунду ожидает получения данных. если сервер отправляет данные сразу после установления соединения с клиентом, то readStringUntil перехватит их. если он отправляет данные позже, значит, соединение уже закрыто. если (!подключено) подключиться, @Juraj

Я не знаю, как использовать "подключенный" код, о котором вы упомянули., @adrianTNT

тогда вам нужно руководство по проекту, а не ответ на сайте вопросов и ответов. https://forum.arduino.cc/, @Juraj

Вчера я разместил тему именно там под руководством проекта, никто не ответил :/, @adrianTNT

Я этого там не вижу., @Juraj