I have the attached script that reads data from a socket server (it is PHP at the server end).
My problem (I think) is that the readStringUntil()
needs a test above it, so that it "reads up to \r" only if there is any data being received, otherwise it seems to keep trying to read forever, because when I DO send data, it is received with 1-2 seconds delay.
If I constantly send (properly \r delimited) data without any pause, then it seems to be received instantly (10-20ms or so).
I tried: if (client.available()) { String received_message = client.readStringUntil('\r'); }
but it doesn't seem to be the right function, doesn't do anything.
This is ESP32 board, compiler mentioned it found two wifi libraries, one in arduino folder and one in ESP32, it used the second one. This might be relevant to what functions are available.
#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");
// I assume this is where I need a test like "if any received data exists" >>>
String received_message = client.readStringUntil('\r');
Serial.println(received_message);
// intentional delay doesn't seem to do much
// when it constantly tries to read for data that is not always there
delay(100);
// do I need to disconnect here ?!
// client.stop();
}
EDIT: my PHP loop looks like this:
do{
$accept = socket_accept($socket) or die("Could not accept incomming connection");
// $message_to_send = 'hi there '.microtime(true)."\r";
// OR
// get message from memcached variables
if($message_to_send!=''){
echo "\nsending: ".$message_to_send;
socket_send($accept, $message_to_send, strlen($message_to_send), MSG_OOB);
}
} while (true);
client.readStringUntil()
waits a second for the data. if the server sends the data immediately after the connection from client is established, then the readStringUntil would catch it. if it sends the data later, the connection is already closed.if (!connected) connect