Open leventesen opened 5 years ago
the reconnect interval setting is not implemented for async right now.
Hmmm, observing the same thing for synchronous version. According to your code, this shouldn't happen.
But, when the server OS correctly reports an RST after ESP32 SYN's, I see immediate SYN flooding in wireshark. It does not matter if the WS server is not running in the first place or is terminated after WS connection was established.
I set the reconnect interval to 5000 after begin()
.
In my understanding, each call of .loop()
will try to open a TCP connection, regardless of elapsed time since last failed attempt. Is there a way to debug this?
EDIT#1: After adding an appropriate Serial.print()
to WebSocketsClient.cpp#136
, I observe that _lastConnectionFail
is always 0
, _reconnectInterval
is correctly set to 5000
.
EDIT#2: got it _client.tcp->connect(_host.c_str(), _port)
apparently returns non-zero, even if connection was rejected via server RST. As this seems to go deep down into the tcp code basement, I don't know how to continue from here.
ok looks like a ESP32 TCP stack problem then.
you can try to check the result of the lwip_connect_r
call here:
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiClient.cpp#L229
for some reason the return value there is not checked which makes no sense to me right now.
if(lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) != 0) {
log_e("lwip_connect_r: %d",errno);
close(sockfd);
return 0;
}
int res = select(sockfd + 1, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv);
if (res != 1)
{
log_e("select: %d",errno);
close(sockfd);
return 0;
}
for reverence:
https://github.com/espressif/esp-lwip/blob/e6f0cab39b3831bd56e83615fd65851294ca6ed4/src/api/sockets.c#L3447 https://github.com/espressif/esp-lwip/blob/e6f0cab39b3831bd56e83615fd65851294ca6ed4/src/api/sockets.c#L886
ok looks like a ESP32 TCP stack problem then. you can try to check the result of the lwip_connect_r call here: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiClient.cpp#L229
Hi, just tried your patch - this seems to work, partially. Even with ws.loop()
called in each Arduino-Loop, there is now only one attempt every 5 seconds, behaviour as expected.
But now I don't seem to be able to open a regular connection. For some reason, now the ESP32 will RST the connection. Meaning with a running server on the PC on the correct port, this pattern repeats every 5 seconds:
So, my workaround is still a ticker setting a flag every 5 seconds. I can only process one message this way, but better than SYN flooding.
In async mode, Reconnect interval is set to 60000, WebSocketsClient is used, What I want is to terminate unauthorized connections in server side. When I terminate or close the connection then WebSocketsClient reconnects immediately like a loop or flood.